【问题标题】:Using std::cout in a parallel for loop using OpenMP [duplicate]在使用 OpenMP 的并行 for 循环中使用 std::cout [重复]
【发布时间】:2019-08-27 11:28:03
【问题描述】:

我想使用 OpenMP 在 C++ 中并行化一个 for 循环。在那个循环中,我想打印一些结果:

#pragma omp parallel for
for (int i=0; i<1000000; i++) {
    if (test.successful() == true) {
        std::cout << test.id() << " " << test.result() << std::endl;
    }
}

不使用 OpenMP 得到的结果:

3 23923.23
1 32329.32
2 23239.45

但是,我使用并行 for 循环得到以下结果:

314924.4244.5
434.
4343.43123

如何避免这样的输出?

【问题讨论】:

    标签: c++ printing openmp


    【解决方案1】:

    原因是打印未定义为原子操作,因此在打印到标准输出仍在进行时会发生上下文切换。

    解决方案:您必须使 for 循环体成为原子操作,使用 #pragma omp atomic

    #pragma omp parallel for
    for (int i=0; i<1000000; i++) {
        if (test.successful() == true) {
            #pragma omp atomic
            std::cout << test.id() << " " << test.result() << std::endl;
        }
    }
    

    【讨论】:

    • atomic 是什么意思?
    • 我收到以下错误:error: invalid operator for ‘#pragma omp atomic’ before ‘&lt;&lt;’ token.
    • @Samuel 请将 if 正文放在方括号内:{ std::cout &lt;&lt; test.id() &lt;&lt; " " &lt;&lt; test.result() &lt;&lt; std::endl; }
    • 我不认为#pragma omp atomic 在这里工作,你需要#pragma omp critical
    • 正如我指出的duplicate 所说,使用#pragma omp critical
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多