我嘗試使用OpenMP減少並行化下面的循環;使用Eigen :: VectorXd減少OpenMP OpenDMP:
#define EIGEN_DONT_PARALLELIZE
#include <iostream>
#include <cmath>
#include <string>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Eigenvalues>
#include <omp.h>
using namespace Eigen;
using namespace std;
VectorXd integrand(double E)
{
VectorXd answer(500000);
double f = 5.*E + 32.*E*E*E*E;
for (int j = 0; j !=50; j++)
answer[j] =j*f;
return answer;
}
int main()
{
omp_set_num_threads(4);
double start = 0.;
double end = 1.;
int n = 100;
double h = (end - start)/(2.*n);
VectorXd result(500000);
result.fill(0.);
double E = start;
result = integrand(E);
#pragma omp parallel
{
#pragma omp for nowait
for (int j = 1; j <= n; j++){
E = start + (2*j - 1.)*h;
result = result + 4.*integrand(E);
if (j != n){
E = start + 2*j*h;
result = result + 2.*integrand(E);
}
}
}
for (int i=0; i <50 ; ++i)
cout<< i+1 << " , "<< result[i] << endl;
return 0;
}
這絕對是平行比沒有更快,但所有4個線程,結果是巨大的變化。當線程數設置爲1時,輸出是正確的。 我將不勝感激,如果有人可以幫助我這個...
我使用編譯標誌的鐺編譯器;
clang++-3.8 energy_integration.cpp -fopenmp=libiomp5
如果這是一個半身像,然後我就必須要學會執行Boost::thread
,或std::thread
...
添加'FIRSTPRIVATE(PARAMS)減少(+:result_int)'你'parallel'指令,刪除'critical',然後再試一次... – Gilles
@Gilles感謝您的答覆。我已編輯我的代碼使第一個'#pragma'語句讀取'#pragma omp parallel firstprivate(params)reduction(+:result_int)',第二個'#pragma'語句保持不變,並且所有後續的'#pragma'語句被刪除。然後程序產生運行時錯誤:'.... const Eigen :: Matrix>:Assertion aLhs.rows()== aRhs.rows()&& aLhs.cols()== aRhs.cols()'失敗。 Aborted' - 我可以保證kspace和result_int都具有相同數量的元素和維度 –
AlexD
您能否將您的示例變爲完整[mcve]?另外,串行版本是否按預期工作? –