3

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

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

有人知道是什么问题吗?

4

2 回答 2

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
于 2012-06-20T08:59:18.183 回答
1

除了 Mystical 指出的错误之外,您似乎认为 openMP 可以变魔术。它最多可以使用您机器上的所有内核。如果你有 2 个核心,如果你调用omp_set_num_threads(np)np>=2 可能会减少 2 个执行时间,但是对于比核心数量大得多的 np,由于并行化开销,代码效率会很低。

Mystical 中的示例显然在 np=4 的至少 4 个内核上运行。

于 2012-06-20T09:19:02.970 回答