今天看到一篇
http://blog.sciencenet.cn/blog-830496-671809.html
文章里面介绍了并行编程的方法,有兴趣去看看。
启用OpenMP的方法:
项目-->项目属性-->配置属性-->c/c++-->语言-->OpenMP支持-->选择 是
其中第二个例子分析一下,代码如下
#include <studio.h>
#include <time.h>
#include <omp.h>
int main() {
long long i;
clock_t t1, t2;
long double t3,sum=0;
t1 = clock():
#pragma omp parallel for
for(i=1;i <= 1000000000; i++){
sum = sum + i / 100;
}
t2=clock();
t3 = t2 - t1;
t3 = t3 / CLOCKS_PER_SEC;
printf("%Lf s \n", t3);
return (0);
}
他的测试结果:
并行计算的运行用了16.415秒。
串行计算的运行用了29.116秒。
在我的机器上,windows 7 SP1 64位旗舰版 + Visual C++ 2012 update 4
测试了N边,没有一边并行计算的运行时间比串行时间短的,反而是运行时间长了一点点。
不知道为啥?其实线程切换也是很费时的。
上面的代码串行和并行的计算结果不一样。不信大家试试,要是一样的话多试一边。
参照下面的代码
https://msdn.microsoft.com/zh-cn/library/6z19s8e0(v=vs.110).aspx
我又写了一个代码
#include <time.h>
#include <omp.h>
int _tmain()
{
long long i, start(1), end(10000000);
clock_t t1, t2;
long double sum(0.0F);
t1 = clock();
#pragma omp parallel default(none) private(i) shared(sum, start, end)
{
#pragma omp for
for(i = start; i < end; ++i)
{
#pragma omp atomic
sum += i;
}
}
t2=clock();
t2 -= t1;
printf("sum:%Lf time:%d s \n", sum, t2);
getchar();
return 0;
}
这样才能得到串行和并行计算相同的结果。
#pragma omp atomic 这句起到作用的。
另外在Windows 7 64旗舰版 + Visual C++ 2013上做了上面的代码同样的测试,同样并行比串行运行时间多一点点。但是发现了一个现象,visual c++ 2013 编译出的exe比2012编译出的exe运行时间要少上不少,或者说2013编译出的exe性能更加,当然指同样的代码。大家试试!!!这是个别现象还就是visual c++ 2013的编译器比2012强上不少。要是那样使用Visual Studio 2013。不过感觉2013的IDE比2012运行起来更顺畅倒是真的。单位(i3+4G内存)和家里(I5+8G内存)的电脑都是这样!!!
其实,并行编程绝没有你想的那么简单!!!