【发布时间】:2012-06-20 08:54:38
【问题描述】:
我正在使用 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;
}
但是,我无法通过更改x 中的omp_set_num_threads(x); 来获得任何加速
用不用OpenMp没关系,计算时间都是一样的,7秒左右。
有人知道问题出在哪里吗?
【问题讨论】:
-
尽管如此,我很确定这个计算有一个封闭的公式。事实上,你可能错过了一个演员表,因为正如目前所写的那样,所有
is -
如果你想要速度,那么规则 No1 是避免不必要的计算,例如在你的内部循环中将
sum += i/(n/10)替换为sum += i*d;并在之前声明const double d=10.0/n;。无论如何,一个聪明的编译器可能会对此进行优化,但最好不要依赖它(例如,编译器可能会优化为除以常数,这会显着降低效率)。 -
我建议你忘记
omp_set_num_threads(),而是设置环境变量OMP_NUM_THREADS。否则,您可能会将程序的线程数固定为比实际运行它的机器的 CPU 计数高得多的值。
标签: c++ multithreading performance openmp