我一塊,我要並行化和OpenMP程序比串行版本慢得多的代碼,那麼,什麼是錯我的執行?這是程序的代碼OpenMP的等待時間內爲
#include <iostream>
#include <gsl/gsl_math.h>
#include "Chain.h"
using namespace std;
int main(){
int const N=1000;
int timeSteps=100;
double delta=0.0001;
double qq[N];
Chain ch(N);
ch.initCond();
for (int t=0; t<timeSteps; t++){
ch.changeQ(delta*t);
ch.calMag_i();
ch.calForce001();
}
ch.printSomething();
}
的Chain.h是
class Chain{
public:
int N;
double *q;
double *mx;
double *my;
double *force;
Chain(int const Np);
void initCond();
void changeQ(double delta);
void calMag_i();
void calForce001();
};
而且Chain.cpp是
Chain::Chain(int const Np){
this->N = Np;
this->q = new double[Np];
this->mx = new double[Np];
this->my = new double[Np];
this->force = new double[Np];
}
void Chain::initCond(){
for (int i=0; i<N; i++){
q[i] = 0.0;
force[i] = 0.0;
}
}
void Chain::changeQ(double delta){
int i=0;
#pragma omp parallel
{
#pragma omp for
for (int i=0; i<N; i++){
q[i] = q[i] + delta*i + 1.0*i/N;
}
}
}
void Chain::calMag_i(){
int i =0;
#pragma omp parallel
{
#pragma omp for
for (i=0; i<N; i++){
mx[i] = cos(q[i]);
my[i] = sin(q[i]);
}
}
}
void Chain::calForce001(){
int i;
int j;
double fij =0.0;
double start_time = omp_get_wtime();
#pragma omp parallel
{
#pragma omp for private(j, fij)
for (i=0; i<N; i++){
force[i] = 0.0;
for (j=0; j<i; j++){
fij = my[i]*mx[j] - mx[i]*my[j];
#pragma omp critical
{
force[i] += fij;
force[j] += -fij;
}
}
}
}
double time = omp_get_wtime() - start_time;
cout <<"time = " << time <<endl;
}
所以方法changeQ()和calMag_i()是實際上比串行代碼快,但我的問題是calForce001()。執行時間是:
- 使用OpenMP 3.939s
- 沒有OpenMP的0.217s
現在,顯然,我做錯了什麼或代碼不能並行。請有用的幫助。 在此先感謝。 卡洛斯
編輯: 爲了闡明I增加功能omp_get_wtime()的問題來計算功能calForce001()的執行時間和所述次爲一個執行是
- 與OMP :0.0376656
- 而不OMP:0.00196766
因此,與OMP方法是慢20倍。
否則,我也計算用於calMag_i()的時間方法
- 與OMP:3.3845e-05
- 而不OMP:9.9516e-05
對於這種方法omp是快3倍。
我希望這確認延遲問題在calForce001()方法。
你不顯示calForce001,但你可能想看看這個和剖析你的代碼:http://stackoverflow.com/questions/7181078/how-to-profile-openmp-bottlenecks –
我顯示calForce是Chain.cpp中的最後一個方法(有一個滾動條) – alfaceor
現在我添加函數來計算在#pragma omp parallel之前和之後使用的時間。所以時間是一個執行如下:與omp的時間是0.0376656,沒有雜注(沒有omp)時間是0.00196766 – alfaceor