#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++ 2012 | Visual C++ 2013 | ||||||
Serial | OpenMP | PPL | Single PPL | Serial | OpenMP | PPL | Single PPL |
17839 | 6655 | 17422 | 13944 | 12001 | 6238 | 17784 | 13847 |
17747 | 7024 | 15249 | 18575 | 11526 | 6784 | 13965 | 13748 |
17828 | 6261 | 16023 | 14765 | 11561 | 6383 | 14197 | 13679 |
17564 | 6232 | 17425 | 14786 | 11143 | 6261 | 15130 | 16367 |
上面的不是具体时间秒或者毫秒,而是clock()的差值。
并行方案看这样需要大量的测试才能来确定。只有具体的方案才能确定那种方法最优。
给出的这个表不是就说明OpenMP比PPL性能一定就好。这只是个例,具体问题还得具体分析。
另外:http://www.codeproject.com/Articles/373305/Visual-Cplusplus-11-Beta-Benchmark-of-Parallel-Loo#ppl
这篇博文还贴出PPL比OpenMP性能好一点点。
提升自己项目的性能,只要比原先方案提升到客户容忍的程度即可。老板一般不会容忍你沉迷技术的,当然也可能我的老板是个例。
老板只要能挣钱他才不在乎你的技术多高明或者多优秀呢。他要的是利益最大化!!!