【问题标题】:omp parallel for output orderomp parallel 用于输出顺序
【发布时间】:2016-09-15 16:59:11
【问题描述】:

我制作了这个简单的程序来测试 openmp 库:

#include<omp.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  int i;
  char buffer[10];
  FILE *fp1;
  sprintf(buffer, "out.txt");
  fp1=fopen(buffer, "a"); 
  #pragma omp parallel for
  for(i=0;i<16;i++)
    fprintf(fp1, "%d ", i);
}

我得到以下结果:8 9 14 15 0 1 6 7 4 5 2 3 12 13 10 11

所以我尝试了一个更简单的程序,将数字放在终端上:

#include<omp.h>
#include<stdio.h>

int main()
{
  int i;
  #pragma omp parallel for
  for(i=0;i<16;i++)
    printf("%d ", i);
}

当我运行它时,这是我的输出: 12 13 4 5 0 1 6 7 2 3 14 15 10 11 8 9

我想了解为什么变量 i 没有被我的核心按顺序排列,我预计会是这样的:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16。

编辑:是的,我有 8 个内核。谢谢大家的回答,现在很清楚了。

【问题讨论】:

  • “我运行了并行代码和预期的顺序行为” - 你为什么期望这个输出?你期待“平行”的事情发生什么变化? (我猜你有 8 个核心?看看每个核心如何按顺序列出 (12,13)​​、(2,3)),但所有核心都同时运行,这是一个先完成的折腾)
  • 是的,这是有道理的。但我认为出于某种原因,第一个获取值的核心是第一个打印输出的核心。我的坏...

标签: c loops io parallel-processing openmp


【解决方案1】:

因为并行执行

了解并行程序如何处理输出是您在继续之前应该掌握的首要概念之一,因为它会在您以后真正开发一些很酷的东西时为您提供帮助。


这意味着每个线程都会启动,并且首先完成或/并首先获得输出资源(在这种情况下为标准输出缓冲区的总线)的人首先打印。

注意输出:

8 9 14 15 0 1 6 7 4 5 2 3 12 13 10 11

您可以确定数字是成对打印的(例如 4,5)。

你有 8 个内核吗?如果是这样,那么您可以确定块,16 个数字除以 8 个核心,因此每个核心有 2 个数字,这可以解释为什么输出是成对打印的。

请注意,我所说的成对是指您可以看到该数字块中的顺序行为。每个线程都会按顺序打印其编号。


同样适用于您更简单的程序。


让我换句话说:

假设您有 8 个内核,您可以想象您的计算机实际上会执行 8 个程序。每个程序将打印 16/8 = 2 个数字。每个程序的核心实际上都是这样的:

int offset = omp knows what to put here
#pragma omp parallel for
for(i = offset; i < offset + 2; i++)
  printf("%d ", i);

所以对于第二个(子)程序offset 将等于 2。

现在假设您打开了 8 个终端,并且您已编译并准备好以可执行名称 subProgram 运行上述(子)程序。

假设你的速度和 Jolteon 一样快,并且在每个终端中都开始执行./subProgram,这样终端/用户向操作系统提交程序执行的开始时间是相同的。

哪个子程序会先打印?

你说不出来!由于您有 8 个子程序想要使用一种资源(屏幕)。因此,谁先到达终点线,即屏幕,谁先打印出来。

这类似于并行执行中发生的事情。


请注意,在现实世界的程序中,当数据更大时(当然是!否则为什么要打扰?),甚至每个程序的输出顺序都无法保证。

这意味着第一个(子)程序可能会执行第一次迭代,但是当它执行第二次迭代时,另一个(子)程序可能已经执行了它的第一次执行并声明了资源(屏幕)。

【讨论】:

  • 我可以强制每个子程序到特定的内核吗?
  • 我发誓我在 SO 中看到过一个问题,提到了同样的事情。不过你不应该那样做,并行计算不能那样工作.. @FrancescoDiLauro
  • 顺便说一下,在 Stack Overflow 中,当我们发现它对我们的问题有帮助时,我们会接受 @FrancescoDiLauro! :) 至于编辑,我恳请您发布一个新问题,询问您要问的全新问题! :)
  • 嘿 :-) 我在这里有点新。我如何接受答案?
  • 三年前我和你一样,我知道那种感觉!好问题顺便说一句,你应该得到我的支持@FrancescoDiLauro!
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
相关资源
最近更新 更多