【问题标题】:OpenMP parallelize multiple sequential loopsOpenMP 并行化多个顺序循环
【发布时间】:2013-01-06 04:09:39
【问题描述】:

我想用 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。

提前致谢

【问题讨论】:

    标签: c++ openmp


    【解决方案1】:

    线程的创建通常不是 openmp 程序的瓶颈。它是将任务分配给线程。线程实际上是在第一个#pragma omp for 生成的(您可以使用像VTune 这样的分析器来验证这一点。在每个循环中,工作都被分配给线程。这种分配通常是问题,因为这是一项代价高昂的操作。

    但是,您应该尝试使用调度程序。因为这可能会对性能产生很大影响。例如玩 schedule(dynamic,chunksize)schedule(static,chunksize) 并尝试不同的块大小。

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2016-07-23
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多