gpt4 book ai didi

c - OpenMP 低性能

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:29 26 4
gpt4 key购买 nike

我试图在我的程序中并行化一个循环,所以我搜索了多线程。首先我看了一下 POSIX 多线程编程教程,它太复杂了所以我试着做一些更简单的事情。我尝试使用 OpenMP。我已经成功地并行化了我的代码,但是执行时间的问题比串行情况更糟。这是我程序的一部分。我希望你告诉我问题是什么。我应该指定哪些变量是共享的,哪些是私有(private)的?我怎么知道每个变量的种类?我希望你能回答我,因为我搜索了很多论坛,但我仍然不知道该怎么做。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>
#define D 0.215 // magnetic dipolar constant

main()
{
int i,j,n,p,NTOT = 1600,Nc = NTOT-1;
float r[2],spin[2*NTOT],w[2],d;
double E,F,V,G,dU;
.
.
.
for(n = 1; n <= Nc; n++){
fscanf(voisins,"%d%d%f%f%f",&i,&j,&r[0],&r[1],&d);
V = 0.0;E = 0.0;F = 0.0;
#pragma omp parallel num_threads(4)
{
#pragma omp for schedule(auto)
for(p = 0;p < 2;p++)
{
V += (D/pow(d,3.0))*(spin[2*i-2+p]-w[p])*spin[2*j-2+p];
E += (spin[2*i-2+p]-w[p])*r[p];
F += spin[2*j-2+p]*r[p];
}
}
G = -3*(D/pow(d,5.0))*E*F;
dU += (V+G);
}
.
.
.
}//End of main()

最佳答案

您正在并行化一个只有 2 次迭代的循环:p=0p=1。 OpenMP 的 omp for 的工作方式是在并行团队(您已将其定义为 4 个线程)中的线程之间拆分循环迭代,并让它们并行处理各自的问题部分.

只有 2 次迭代,您的 2 个线程将闲置。最重要的是,实际找出哪些线程将处理问题的哪一部分需要开销。如果您的实际循环不会花费很长时间(在本例中显然不会),那么开销将超过您从并行化中获得的好处。

更好的策略通常是尽可能将最外层循环与 OpenMP 并行化,以解决平均拆分工作和减少(相对)开销的问题。或者,您可以使用 OpenMP 4.0 的 omp simd 命令在最低循环级别进行并行化。

最后,您没有正确计算变量 VEF。因为它们是从迭代到迭代求和的,所以您应该使用 reduction(+:V) 将它们全部定义为缩减变量。如果您目前按原样得到正确答案,我会感到惊讶。

(也正如 High Performance Mark 所说:确保您计时的是程序的挂钟执行时间,而不是程序的 CPU 时间执行时间。这通常使用 omp_get_wtime() 完成。 )

关于c - OpenMP 低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32842616/

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