在线程之间平均划分进程

时间:2013-09-06 14:38:33

标签: c multithreading algorithm division

我正在尝试提出一种算法,在许多线程上尽可能均匀地划分多个进程。每个过程花费相同的时间。 流程数量可以在1到100万之间变化。 threadCount是固定的,可以是4到48之间的任何地方。

下面的代码确实均匀地划分了所有工作,除了最后一种情况,我扔掉了剩下的东西。     有没有办法解决这个问题,以便更均匀地分配工作?

    void main(void)
{
    int processBegin[100];
    int processEnd[100];
    int activeProcessCount = 6243;
    int threadCount = 24;

int processsInBundle  = (int) (activeProcessCount / threadCount);
int processBalance    = activeProcessCount - (processsInBundle * threadCount);

for (int i = 0; i < threadCount; ++i)
{
    processBegin[ i ] = i * processsInBundle;
    processEnd[ i ]   = (processBegin[ i ] +  processsInBundle) - 1;
}

processEnd[ threadCount - 1 ] += processBalance;


FILE *debug = fopen("s:\\data\\testdump\\debug.csv", WRITE);
for (int i = 0; i < threadCount; ++i)
{
    int processsInBucket = (i == threadCount - 1) ? processsInBundle + processBalance : processBegin[i+1] - processBegin[i];
    fprintf(debug, "%d,start,%d,stop,%d,processsInBucket,%d\n", activeProcessCount, processBegin[i], processEnd[i], processsInBucket);
}
fclose(debug);

}

2 个答案:

答案 0 :(得分:2)

提供第一个activeProcessCount % threadCount个帖子processInBundle + 1个流程,并为其他processsInBundle个流程提供。

int processInBundle  = (int) (activeProcessCount / threadCount);
int processSoFar = 0;
for (int i = 0; i < activeProcessCount % threadCount; i++){
    processBegin[i] = processSoFar;
    processSoFar += processInBundle + 1;
    processEnd[i] = processSoFar - 1;
}
for (int i = activeProcessCount % threadCount; i < threadCount; i++){
    processBegin[i] = processSoFar;
    processSoFar += processInBundle;
    processEnd[i] = processSoFar - 1;
}

答案 1 :(得分:0)

与试图将5便士分成3个人的问题相同。除非你能看到一半便士,否则这是不可能的。

即使所有进程都需要相同数量的理论运行时间,它也不意味着由于内核调度,缓存性能和各种其他硬件相关因素,它们将在相同的时间内执行。

建议一些性能优化:

  • 使用动态排程。即将您的工作分成批次(可以是1号)并让您的线程一次一批,运行它,然后选择下一个。这样线程将一直有效,直到所有批次都消失。
  • 更高级的是从较大的批处理大小开始(通常为numwork/numthreads,并在每次线程从池中解析时减少它)。 OpenMP将其称为引导式调度。