我正在使用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秒。
有人知道这是什么问题吗?
答案 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。