我试图理解为什么以下示例代码在并行执行时运行速度较慢。
#include <iostream>
#include <vector>
#include <complex>
#include <cmath>
#include <random>
#include <omp.h>
using namespace std;
void f(vector<complex<double>> &a, vector<complex<double>> &b){
const complex<double> I(0,1);
#pragma omp parallel
{
#pragma omp for
for(int j=0; j<a.size(); j++){
a[j] = exp(1.0*j*I)*b[j];
}
//Doing some work with a
#pragma omp for
for(int j=0; j<a.size(); j++){
a[j] = exp(1.0*j*I)*b[j];
}
}
}
int main(){
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(0, 1.0);
int N = 12;
vector<complex<double>> a(pow(2,N));
vector<complex<double>> b(pow(2,N));
double start = omp_get_wtime();
for(int j=0; j<100000;j++){
//b holds new data on each iteration
for(int j=0; j<b.size(); j++)
b[j] = complex<double>(dis(gen), dis(gen));
f(a,b);
}
double stop = omp_get_wtime();
cout << stop-start << endl;
return 0;
}
对于N = 12,顺序代码比并行版本(4个线程)快大约15-20%。 我的OpenMP实现使用线程池,所以如果创建了线程团队,我应该只支付一次。我没看到的额外开销在哪里?
对于N = 14,代码表现如预期,即并行版本比顺序版本快4倍。
修改 有关该系统的一些信息:
Intel Core i7-6820HQ @ 2.70GHz
16 GB RAM
编译器:g ++ 7.2.0
编译为:g++ -std=c++11 -o test test.cpp -O3 -lgomp -fopenmp
启用代码优化有助于N = 12。并行代码现在稍快一点。对于N = 10,“问题”仍然存在。我觉得这是我所期待的行为,但我并不完全确定背后的原因。结果如下:
+------+-----------------+----------------+
| | OpenMP disabled | OpenMP enabled |
+------+-----------------+----------------+
| N=10 | 6.966 s | 13.222 s |
| | 6.801 s | 13.131 s |
| | 6.835 s | 13.111 s |
| | 6.764 s | 13.502 s |
| N=12 | 27.323 s | 23.563 s |
| | 26.886 s | 24.002 s |
| | 26.950 s | 23.331 s |
| | 27.260 s | 23.2636 s |
+------+-----------------+----------------+