【问题标题】:Parallel Nested For Loop but Output Results in Order并行嵌套 For 循环但输出结果按顺序排列
【发布时间】:2017-10-22 10:50:33
【问题描述】:

试图减少我一直在处理的程序的时间。下面是我的代码的一部分,其中元素相互比较以产生计算。然后将此计算结果打印到控制台。

#pragma omp parallel for
for (int i = 0; i < numberOfStuff - 1; i++) {
    /*
    [10]
    */
    for (int j = i + 1; j < numberOfStuff ; j++) {
        double calc= stuffCompared(b[i], b[j]);
        printf("%2d %2d -> %.20lf\n", i, j, calc);
    }
}

我的问题是尝试在控制台上按顺序打印这些结果,但同时也减少了我的程序运行所需的时间。

我尝试将结果存储到数组中。事实证明,当打印到控制台时,这对性能时间的成本很高。我也尝试使用 omp 命令,如下所示...

#pragma omp parallel for ordered
...
#pragma omp ordered
printf("%2d %2d -> %.20lf\n", i, j, calc);

... 对于 printf 但发现它并不总是产生有序的结果 我可以按顺序实现,但会产生更好的时间性能。

如果我是 OpenMP 和并行编程的新手,我将不胜感激。

【问题讨论】:

    标签: c++ performance parallel-processing openmp


    【解决方案1】:

    您还必须在有序构造中执行fflush(stdout); 以确保顺序输出。也就是说:

    我尝试将结果存储到数组中。事实证明,当打印到控制台时,这会像预期的那样耗费性能时间

    这毫无意义。将元素存储在内存中的速度比格式化输出快得多,因此将结果存储在中间数组中会对性能产生显着影响。一定有其他的影响在起作用。内存布局/错误共享可能存在问题,但与printf 相比,这也无关紧要。我强烈建议您沿着这条路线走,并尝试找出那里出了什么问题。

    【讨论】:

    • 谢谢祖蓝。我正在和一位提到同样事情的朋友交谈。我做错了什么。我会努力寻找解决方案。
    • 谢谢祖蓝,想出了一个解决办法。 竖起大拇指
    【解决方案2】:

    特别感谢 Zulan 告诉我我绝对错了。在问这个问题之前,我进一步探索并意识到了我之前的错误。

    此答案适用于遇到类似问题或寻求类似解决方案的其他人。

    我使用向量进行计算,并使用 i 和 j 来分配计算的存储位置,如下所示。

    std::vector<double> calc;
    int vectorSize = (numberOfStuff * numberOfStuff) - numberOfStuff;
    calc.resize(vectorSize);
    
    #pragma omp parallel for
    for (int i = 0; i < numberOfStuff - 1; i++) {
        for (int j = i + 1; j < numberOfStuff; j++) {
            calc[(i * 10) + j] = CompareStuff(b[i], b[j]);
        }
    }
    
    // Print
    for (int i = 0; i < numberOfStuff - 1; i++) {
        for (int j = i + 1; j < numberOfStuff ; j++) {
            printf("%2d %2d -> %.20lf\n", i, j, calc[(i * 10) + j]);
        }
    }
    

    在 for 循环中使用 omp 并行执行计算。一旦完成,新的 for 循环将按顺序打印结果。

    重要的是运行我的程序的时间仍然是 16 到 17 秒,但现在结果正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多