Проблема не в медленном Parallel
, а в Seqential
, слишком быстром:
- В
Seqential
компилятор видит, что DoWork
всегда будет давать один и тот же результат, поэтому цикл, вызывающий его 100 раз, оптимизируется, и DoWork
в конечном итоге вызывается только один раз .
- Компилятор не достаточно умен, чтобы оптимизировать
parallel_for
таким же образом, поэтому он в конечном итоге выполняет реальную работу (на самом деле в 100 раз больше фактической работы).
Если вы сделаете DoWork
зависимым от счетчика цикла, различные вызовы теперь будут давать разные результаты, поэтому никакие вызовы не будут избыточными, поэтому компилятору будет нечего оптимизировать.
Например:
#include <vector>
#include <iostream>
#include <math.h>
#include <ppl.h>
#include <Windows.h>
using namespace std;
using namespace Concurrency;
double DoWork(int workload, int outer_i)
{
double result=0;
for(int i =0 ; i < workload;i++)
{
result +=sqrt((double)i * 4*3) + i* i;
}
result += outer_i;
return result;
}
vector<double> Seqential()
{
vector<double> results(100);
for(int i = 0 ; i <100 ; i++)
{
results[i] = DoWork(1000000, i);
}
return results;
}
vector<double> Parallel()
{
vector<double> results(100);
parallel_for(0,(int)100,1,[&results](int i)
{
results[i] = DoWork(1000000, i);
});
return results;
}
double Sum(const vector<double>& results)
{
double result =0;
for(int i = 0 ; i < results.size();i++)
result += results[i];
return result;
}
int main()
{
DWORD start = GetTickCount();
vector<double> results = Seqential();
DWORD duration = GetTickCount() - start;
cout<<"Sequential Duration : "<<duration <<" Result : " <<Sum(results) << endl;
start = GetTickCount();
results = Parallel();
duration = GetTickCount() - start;
cout<<"Prallel Duration : "<<duration <<" Result : " <<Sum(results) << endl;
system("PAUSE");
return 0;
}
При сборке Visual C ++ 2010 в конфигурации выпуска и запуске на четырехъядерном процессоре это выдает:
Sequential Duration : 1607 Result : 1.68692e+015
Prallel Duration : 374 Result : 1.68692e+015
(Кстати, вам действительно следует лучше отформатировать код.)