OpenMP并行化多个顺序循环
我想用OpenMP并行化以下功能:
void calculateAll() {
int k;
int nodeId1, minCost1, lowerLimit1, upperLimit8;
for (k = mostUpperLevel; k > 0; k--) {
int myStart = borderNodesArrayStartGlobal[k - 1];
int size = myStart + borderNodesArraySizeGlobal[k - 1];
/* this loop may be parallel */
for (nodeId1 = myStart; nodeId1 < size; nodeId1++) {
if (getNodeScanned(nodeId1)) {
setNodeScannedFalse(nodeId1);
} else {
minCost1 = myMax;
lowerLimit1 = getNode3LevelsDownAll(nodeId1);
upperLimit8 = getUpperLimit3LevelsDownAll(nodeId1);
changeNodeValue(nodeId1, lowerLimit1, upperLimit8, minCost1, minCost1);
}
}
}
int myStart = restNodesArrayStartGlobal;
int size = myStart + restNodesArraySizeGlobal;
/* this loop may also be parallel */
for (nodeId1 = myStart; nodeId1 < size; nodeId1++) {
if (getNodeScanned(nodeId1)) {
setNodeScannedFalse(nodeId1);
} else {
minCost1 = myMax;
lowerLimit1 = getNode3LevelsDownAll(nodeId1);
upperLimit8 = getUpperLimit3LevelsDownAll(nodeId1);
changeNodeValue(nodeId1, lowerLimit1, upperLimit8, minCost1, minCost1);
}
}
}
尽管我可以在2个内部循环中使用“omp pragma parallel for”,但由于创建新线程的开销不断,代码太慢了。 有没有办法将“omp pragma parallel”分开,以便在函数开始时采用必要的线程,然后使用“omp pragma for”来获得最佳结果? 我使用的是gcc 4.6。
提前致谢
线程的创建通常不是openmp程序的瓶颈。 这是线程的任务分配。 这些线程实际上是在第一个#pragma omp for
生成的(你可以使用像VTune这样的分析器来验证,在每个循环中,工作被分配给线程,这种分配通常是个问题,因为这是一个代价高昂的操作。
但是,你应该尝试与调度程序一起玩。 因为这可能会对性能产生重大影响。 例如,使用schedule(dynamic,chunksize)
与schedule(static,chunksize)
并尝试不同的块大小。