gpt4 book ai didi

c - omp parallel 用于输出顺序

转载 作者:行者123 更新时间:2023-12-04 02:10:05 25 4
gpt4 key购买 nike

我制作了这个简单的程序来测试 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);
}

我得到以下结果:89141501个6个74个5个2个3个12131011

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

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

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

当我运行它时,这是我的输出:12134个5个01个6个72个3个141510118个9

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

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

最佳答案

因为并行执行

了解并行程序如何处理输出是您在继续之前应该首先掌握的概念之一,因为它在您实际开发一些很酷的东西时帮助您。


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

注意输出:

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

您可以识别出数字是成对打印的(例如 4,5)。

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

请注意,成对表示您可以看到该数字 block 中的顺序行为。每个线程将按顺序打印其编号。


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


换句话说:

假设你有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 个子程序想要使用一个资源(屏幕)。因此,谁先到达终点线,即屏幕,谁就会先打印。

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


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

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

关于c - omp parallel 用于输出顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39516584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com