无法获得加速OpenMP

时间:2012-06-20 08:54:38

标签: c++ multithreading performance openmp

我正在使用OpenMP在C ++中编写简单的并行程序。 我正在使用Windows 7和Microsoft Visual Studio 2010 Ultimate。 我将项目的语言属性更改为“是/ OpenMP”以支持OpenMP

我在这里提供代码:

#include <iostream>
#include <omp.h> 

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

但是,通过更改x中的omp_set_num_threads(x);,我无法获得任何加速 无论我是否使用OpenMp都没关系,计算时间是相同的,大约7秒。

有人知道这是什么问题吗?

2 个答案:

答案 0 :(得分:2)

您的pragma语句缺少parallel说明符:

#include <iostream>
#include <omp.h> 

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp parallel for reduction(+:sum)  //  add "parallel"
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

顺序:

sum=3.6e+009
2.30071

<强>并行

sum=3.6e+009
0.618365

这是一个超线程加速的版本。我不得不将迭代次数增加10倍,并将数据类型增加到long long

double sum; 
long long i;
long long n = 8000000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(8); 

    double start = omp_get_wtime();


    sum = 0;    
    #pragma omp parallel for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;       

    double end = omp_get_wtime(); 
    cout << end - start << endl;
    system("pause");

    return  EXIT_SUCCESS;
}

主题:1

sum=3.6e+014
13.0541

主题:2

sum=3.6e+010
6.62345

主题:4

sum=3.6e+010
3.85687

主题:8

sum=3.6e+010
3.285

答案 1 :(得分:1)

除了Mystical指出的错误之外,你似乎认为openMP可以用于魔术。它可以充分利用您计算机上的所有核心。如果您有2个内核,如果您使用np&gt; = 2调用omp_set_num_threads(np),则可能会将执行时间减少2,但是如果np远大于内核数量,则由于并行化开销,代码效率会很低。 / p>

Mystical的例子显然是在至少4个核心上运行,np = 4。