使用 OpenMP 在并行 for 循环中使用 std::cout

Using std::cout in a parallel for loop using OpenMP

本文关键字:std cout 循环 OpenMP 并行 for 使用      更新时间:2023-10-16

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

如何避免此类输出?

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

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

#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;
}
}