我想在我的程序中並行化一個循環,所以我搜索了多線程。首先我看看POSIX多線程編程教程,它非常複雜,所以我試圖做一些簡單的事情。我嘗試使用OpenMP。我已經成功地並行化了我的代碼,但執行時間問題比系列案例更差。這是低於一部分確定我的程序。我希望你告訴我有什麼問題。我應該指定哪些變量是共享的,什麼是私有的?我怎麼知道每個變量的種類?我希望你能回答我,因爲我在很多論壇上搜索過,但我仍然不知道該怎麼做。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'。 –