我制作了这个简单的程序来测试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 五 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 五 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个核心。谢谢大家的答案,现在很清楚。
答案 0 :(得分:4)
因为并行执行。
了解并行程序如何处理输出是您在继续之前应该掌握的第一个概念之一,因为 将在您实际开发出酷炫的东西后帮助您。
这意味着每个线程都会启动,无论谁先完成或/并首先获得输出资源(在这种情况下为stdout缓冲区的总线),首先打印。
注意输出:
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
,这样终端/用户提交程序执行到OS的开始时间是相同的。< / p>
首先打印哪个子程序?
你说不出来!由于您有8个子程序想要使用一个资源(屏幕)。因此,无论谁首先到达终点线,屏幕都将首先打印出来。
这类似于并行执行中发生的事情。
请注意,在真实世界的程序中,当数据更大时(当然它们是!否则为什么要打扰parallel-proccesing?),甚至不保证每个程序的输出顺序。
这意味着第一个(子)程序可以执行第一次迭代,但是当它执行第二次迭代时,另一个(子)程序可能已经执行了它的第一次执行并且声明了资源(屏幕)。 / p>