了解OpenMP开销

时间:2018-01-04 11:04:22

标签: c++ openmp

我试图理解为什么以下示例代码在并行执行时运行速度较慢。

#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      |
+------+-----------------+----------------+

0 个答案:

没有答案