我正在尝试提出一种算法,在许多线程上尽可能均匀地划分多个进程。每个过程花费相同的时间。 流程数量可以在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);
}
答案 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个人的问题相同。除非你能看到一半便士,否则这是不可能的。
即使所有进程都需要相同数量的理论运行时间,它也不意味着由于内核调度,缓存性能和各种其他硬件相关因素,它们将在相同的时间内执行。
建议一些性能优化:
numwork/numthreads
,并在每次线程从池中解析时减少它)。 OpenMP将其称为引导式调度。