Integral with the Parallel Patterns Library

 
Played a bit with PPL this week-end. This helped me understand quite a bit more than what’s in the documentation thanks to the Visual Studio 2010’s Parallel Tasks and Parallel Stacks windows:
 

#define _WIN32_WINNT 0x0601

#include <windows.h>

#include <ppl.h>

#include <iostream>

#include <exception>

using namespace std;

using namespace Concurrency;

 

double Integrand(double x) {

   return 3 * x * x;

}

 

template <typename FN>

double Integrate(FN fn,double from, double to, double dx) {

   if (from >= to)

      throw invalid_argument("’from’ must be smaller than ‘to’");

 

   if (dx <= 0)

      throw invalid_argument("’dx’ must be greater than 0");

 

   auto steps = static_cast<size_t>((to – from) / dx);

 

   if (!steps)

      throw underflow_error("’dx’ is too big or the interval [‘from’, ‘to’] is too small");

 

   combinable<double> integral;

   from += dx / 2; // Let’s position ourself at the middle of the rectangle between [from, from + dx]

   parallel_for(size_t(0), steps, [&] (int partition) {

      integral.local() += dx * fn(from + dx * partition) ;

   });

 

   return integral.combine(plus<double>());

}

 

int wmain() {

   auto from = 0.0;

   auto to = 5.0;

   auto dx = 0.1;

   wcout << L"Integral of 3*X^2 between " << from << L" and " << to << L" is " << Integrate(Integrand, from, to, dx) << endl;

   return 0;

}

Advertisements
This entry was posted in Computers and Internet. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s