并行编程 PPL或OpenMP

#include "stdafx.h"
#include <time.h>
#include <omp.h>
#include <ppl.h>
#include <iostream>

using namespace std;

static long long _start = 1;
static long long _end = 1000000000;

long double serial()
{
	long double sum(0.0F);
	for(long long i = _start; i < _end; i++)
	{
		sum += (i / 100);
	}
	return sum;
}

long double openmp()
{
	//这是上篇文章的方法,这是线程同步因此性能很差。
	/*#pragma omp parallel default(none) shared(sum, start, end)
	{
		#pragma omp for
		for(i = start; i < end; ++i)
		{
			#pragma omp atomic
			sum += i;
		}
	}*/

	long long i;
	long double sum(0.0F);
	#pragma omp parallel for reduction(+:sum) //当所有线程执行完毕后将每个线程的sum采用+进行计算得到最后的结果。
	for(i = _start; i < _end; ++i)
	{
		sum += (i / 100);
	}
	return sum;
}

//在TBB中有parallel_<span style="font-family: Arial, Helvetica, sans-serif;">reduction,但是在ppl中没有。采用下面的方法实现。</span>

long double ppl()
{
	using namespace concurrency;
	combinable<long double> sums;
	parallel_for(_start, _end, [&sums](long long i)
	{
		sums.local() += (i / 100);
	});
	return sums.combine(plus<long double>());
}

int _tmain()
{
	clock_t t1,t2;
	long double sum;
	t1 = clock();
	sum = serial();
	printf("serial sum:%Lf ", sum);
	t2 = clock();
	t2 -= t1;
	printf("time:%d\n", t2); //此处分开写的原因:假如采用下面同样的写法编译器会将<span style="font-family: Arial, Helvetica, sans-serif;">sum = serial();的计算优化到调用sum的地方执行。这样t2=0了。</span>


	t1 = clock();
	sum = openmp();
	t2 = clock();
	t2 -= t1;
	printf("openmp sum:%Lf time:%d s \n", sum, t2);

	t1 = clock();
	sum = ppl();
	t2 = clock();
	t2 -= t1;
	printf("   ppl sum:%Lf time:%d s \n", sum, t2);
	
	getchar();
	return 0;
}

这是比较性能的代码,串行 OpenMP PPL三种方法的测试。

上篇说visual c++ 2013编译出的exe性能强点,下面给出数字。

Visual C++ 2012Visual C++ 2013
SerialOpenMPPPLSingle PPLSerialOpenMPPPLSingle PPL
17839665517422139441200162381778413847
17747702415249185751152667841396513748
17828626116023147651156163831419713679
17564623217425147861114362611513016367
注:Single PPL是将OpenMP关闭然后将其他的注释掉后重新编译的exe执行的时间长。

上面的不是具体时间秒或者毫秒,而是clock()的差值。

并行方案看这样需要大量的测试才能来确定。只有具体的方案才能确定那种方法最优。

给出的这个表不是就说明OpenMP比PPL性能一定就好。这只是个例,具体问题还得具体分析。

另外:http://www.codeproject.com/Articles/373305/Visual-Cplusplus-11-Beta-Benchmark-of-Parallel-Loo#ppl

这篇博文还贴出PPL比OpenMP性能好一点点。

提升自己项目的性能,只要比原先方案提升到客户容忍的程度即可。老板一般不会容忍你沉迷技术的,当然也可能我的老板是个例。

老板只要能挣钱他才不在乎你的技术多高明或者多优秀呢。他要的是利益最大化!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值