【发布时间】:2015-11-12 01:49:01
【问题描述】:
我正在尝试学习并行计算的基础知识,但我的计算机遇到了问题。看看我下面的代码。基本上,我想打印出“Hello World!”这一行。对于我的计算机拥有的每个内核。我的电脑有四个核心,所以它应该打印出该行四次。如果我使用注释掉的 'cout' 行而不是 'printf' 行,输出将全部混乱。这是因为 '\n' 转义命令与 "Hello World!" 是分开执行的,所以新行输出会随机出现。 'printf' 行是这个问题的解决方案,因为该行是一次性执行的(而不是像 'cout' 行那样分成几部分)。但是,当我使用“printf”时,我的输出仍然像使用“cout”一样混乱。我不知道为什么会这样。我在另一台计算机上尝试了完全相同的代码,它运行良好。只有我的电脑继续用“printf”混淆输出。我已经通过电子邮件向我的 CS 教授发送了电子邮件,他不知道为什么它会在我的计算机上执行此操作。我知道我在我的计算机上正确设置了 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;
}
为了说明我在说什么,这是我在计算机上运行上述代码时的输出:
你好我
世界你好!
rld!
世界你好!
【问题讨论】:
-
我刚刚尝试使用
cout,它完美地工作:ideone.com/dPPQeO -
endl部分可能是问题的根源,因为它会刷新输出缓冲区。 -
这几乎是您在并行运行时应该期望发生的事情。没有什么可以阻止 Core 1 的 printf 在 Core 2 的中间运行。这就是为什么并行编程很难。
-
在某些实现中,
printf会获得内部锁,因此它可以并行工作,但它纯粹是实现细节,不能依赖 -
@R.Yoder 对我来说 printf 似乎很明显 不是 原子的(“一次执行”),因为您刚刚证明了这一点。
标签: c++ c parallel-processing openmp