我正在使用 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/