gpt4 book ai didi

c - 为什么 openmp 不并行化这段代码?

转载 作者:行者123 更新时间:2023-12-02 07:06:30 27 4
gpt4 key购买 nike

此代码并未使计算 4 个总和的代码更快。相反,它甚至需要更多的时间。输出也不是预期的。

#include <stdio.h>
#include <omp.h>
int main()
{
int i,j,k,l;
int sum = 0,sum1 = 0,sum2 = 0,sum3 = 0;
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
{
printf("%d",omp_get_thread_num());
for(i = 0; i < 500000000; i++) sum = sum + 1;
}
#pragma omp section
{
printf("%d",omp_get_thread_num());
for(i = 0; i < 500000000; i++) sum1 = sum1 + 1;
}
#pragma omp section
{
printf("%d",omp_get_thread_num());
for(i = 0; i < 500000000; i++) sum2 = sum2 + 1;
}
#pragma omp section
{
printf("%d",omp_get_thread_num());
for(i = 0; i < 500000000; i++) sum3 = sum3 + 1;
}
}
}
printf("sum is %d %d %d %d", sum,sum1,sum2,sum3);
}

输出是 总和是 218748707 222052401 239009041 196849489

请让我知道在此处使用 openmp 的缺陷。

最佳答案

速度变慢是因为 sumsum1sum2sum3 是共享变量,并且作为这样,编译器必须为每个增量生成获取/更新/存储指令,而不是像串行版本那样仅将中间总和保存在寄存器中。

您应该使每个总和在使用它的线程中是本地的。最简单的方法是对每个总和进行归约:

#pragma omp parallel private(i) reduction(+:sum,sum1,sum2,sum3)
{
// Rest of the code goes unchanged
}

private(i) 将解决结果不正确的问题。 reduction(+:sum,sum1,sum2,sum3) 将使每个线程累积自己的 sumsum1sum2 副本sum3,最后将本地副本相加形成最终值。

以下是一些性能数据:

连续版 - 3.812 秒:

$ gcc -o mp.x mp.c -lgomp
$ time ./mp.x
0000sum is 500000000 500000000 500000000 500000000
./mp.x 3.81s user 0.00s system 99% cpu 3.812 total

带有共享变量的 OpenMP 版本 - 7.982 秒:

$ gcc -fopenmp -o mp.x mp.c
$ time OMP_NUM_THREADS=4 ./mp.x
0132sum is 500000000 500000000 500000000 500000000
OMP_NUM_THREADS=4 ./mp.x 21.88s user 0.86s system 284% cpu 7.982 total

减少了 OpenMP 版本 - 1.226 秒:

$ gcc -fopenmp -o mp.x mp.c
$ time OMP_NUM_THREADS=4 ./mp.x
0321sum is 500000000 500000000 500000000 500000000
OMP_NUM_THREADS=4 ./mp.x 4.53s user 0.00s system 370% cpu 1.226 total

还有另一种代码转换会额外减慢速度,事实是 sumsum1sum2 sum3 位于主程序的堆栈上,而部分代码由 OpenMP 处理器提取并放入单独的函数中,然后由并行组中的每个线程调用。该函数提供了一个数据结构,其中包含指向四个共享和的指针,并且代码使用这些指针进行操作。您可以比较两种情况下的汇编器输出并亲自查看 - 如果您想更深入地研究并行性能,这样做非常有启发性。

关于c - 为什么 openmp 不并行化这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077690/

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