【发布时间】:2016-03-21 00:30:25
【问题描述】:
我有一段代码要并行化,而 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
现在,很明显我做错了什么,或者代码无法并行化。请任何有用的帮助。 提前致谢。 卡洛斯
编辑: 为了澄清这个问题,我添加了函数 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,但你可能想看看这个并分析你的代码:stackoverflow.com/questions/7181078/…
-
我显示 calForce 是 Chain.cpp 中的最终方法(有一个滚动条)
-
现在我添加函数来计算使用#pragma omp 并行之前和之后的时间。因此,一次执行的时间如下:有 omp 的时间是 0.0376656,没有编译指示(无 omp)的时间是 0.00196766
-
也许你可以have a look here 看看你的一些选项来使算法扩展......
标签: c++ performance parallel-processing openmp