我正在尝试学习并行计算的基础知识,但我的计算机遇到了问题。看看我下面的代码。基本上,我想打印出“Hello World!”这一行。对于我的计算机拥有的每个核心。我的计算机有四个核心,因此它应该打印该行四次。如果我使用注释掉的“cout”行而不是“printf”行,则输出将变得困惑。这是因为“\n”转义命令与“Hello World!”分开执行,因此新行输出会随机出现。 “printf”行是这个问题的解决方案,因为该行是一次性执行的(不像“cout”行那样分成多个部分)。然而,当我使用“printf”时,我的输出仍然很困惑,就像我使用“cout”一样。我不知道它为什么这样做。我在另一台计算机上尝试了完全相同的代码,它运行得很好。只有我的计算机继续将输出与“printf”混淆。我已经通过电子邮件向我的计算机科学教授发送了有关此问题的电子邮件,他不知道为什么会在我的计算机上执行此操作。我知道我在计算机上正确设置了 OpenMP。有并行计算经验的人知道为什么这会在我的计算机上出现问题吗?
#include <omp.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
#pragma omp parallel
{
printf("Hello World!\n");
//cout << "Hello World!\n" << endl;
}
return 0;
}
为了展示我正在谈论的内容,以下是我在计算机上运行上述代码时的输出:
Hello Wo
Hello World!
rld!
Hello World!
最佳答案
抱歉,你的教授弄错了。您需要利用互斥或其他一些障碍来保证不间断地使用共享资源(在本例中为 STDOUT
输出文件)。
无论printf
如何,混合输出都是潜在的预期行为或std::cout::operator<<()
。由于设计不同,您看到的行为差异是每个执行持续时间的细微差别。无论哪种情况,您都应该预料到这种行为。
I just don't understand why it would be working for everyone else.
事实并非如此。成为类的英雄,解释它是如何工作的以及如何解决它。告诉他们如此表达他们的爱。 :)
关于c++ - 并行计算——输出困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49099184/