并行编程,绝不是你想的那么简单

今天看到一篇

http://blog.sciencenet.cn/blog-830496-671809.html

文章里面介绍了并行编程的方法,有兴趣去看看。

启用OpenMP的方法:

项目-->项目属性-->配置属性-->c/c++-->语言-->OpenMP支持-->选择 是

其中第二个例子分析一下,代码如下

#include 
#include 
#include 

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 
#include 

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内存)的电脑都是这样!!!

其实,并行编程绝没有你想的那么简单!!!

你可能感兴趣的:(并行编程,绝不是你想的那么简单)