c++ - 无法获得加速 OpenMP

标签 c++ multithreading performance openmp

我正在使用 OpenMP 在 C++ 中编写简单的并行程序。 我在 Windows 7 和 Microsoft Visual Studio 2010 Ultimate 上工作。 我将项目的语言属性更改为“Yes/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;
}

但是,我无法通过更改 omp_set_num_threads(x); 中的 x 获得任何加速 不管我是否使用OpenMp,计算时间都是一样的,大约7秒。

有人知道问题出在哪里吗?

最佳答案

您的 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

关于c++ - 无法获得加速 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11116003/

相关文章:

multithreading - Delphi应用程序中的定期任务

c++ - 使用 Eigen 库运行 UmfPackLU<> 时 Appcrash

c++ - 书 "Cracking the coding interview"中单例示例中的错误/问题?

multithreading - TPL : Background thread completion notification?

python - 为什么 Python 中的子类化会减慢速度?

ruby-on-rails-3 - Rails的性能问题:如何发送gzip Assets

javascript - 为什么这个 window.innerheight 的性能这么差?

c# - Windows 7 动画鼠标拖动事件

c++ - 自动链接静态库的依赖项

java - 干净地停止线程