【发布时间】:2015-09-29 11:22:55
【问题描述】:
我试图在我的程序中并行化一个循环,所以我搜索了多线程。首先我看了一下 POSIX 多线程编程教程,它太复杂了,所以我试着做一些更简单的事情。我尝试使用 OpenMP。我已经成功地并行化了我的代码,但执行时间问题比串行情况更糟。这是我的程序的一部分。我希望你告诉我有什么问题。我应该指定哪些变量是共享的,哪些是私有的?我怎么知道每个变量的种类?我希望你能回答我,因为我搜索了很多论坛,但我仍然不知道该怎么做。
#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()
【问题讨论】:
-
执行时间问题比串行情况更糟 这通常是由于使用了错误的时序例程造成的。您的代码没有显示您正在使用的内容,最好确保它是
omp_get_wtime。