并行嵌套For循环但输出结果按顺序排列

时间:2017-10-22 10:50:34

标签: c++ performance parallel-processing openmp

尝试减少我一直在努力的计划的时间。下面是我的代码的一部分,其中元素相互比较以产生计算。然后将此计算打印到控制台。

#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和并行编程的新手,所以对此有任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

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

  

我尝试将结果存储到数组中。事实证明,当打印到控制台

时,预期的性能成本会很高

这没有任何意义。将元素存储在内存中比格式化输出快得多,将结果存储在中间数组中会对性能产生显着影响。工作中必须有其他一些效果。内存布局/错误共享可能存在问题,但与printf相比,这甚至无关紧要。我强烈建议你继续这条路线,并试图找出那里出了什么问题。

答案 1 :(得分:0)

特别感谢 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秒,但现在结果是有序的。