ネタ元 → Windows 7に対応し、並列化サポートも強化された「インテル C++ コンパイラー 11.1」
記事の内容はともかくも、OpenMPておいしいの?
ネタ元のサンプル程度だと、Intel TBB とか Parallel Patterns Library の方が簡単だしわかりやすい。
もっとややこしいことやるとなれば TBB/PPLではできない
細かなチューニングとかそんなのができるのかしら...
/*
* ネタ元にあったサンプルを VC++10: PPL で書いてみた
*/
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <ppl.h> // Parallel Patterns Library
using namespace std;
int main() {
srand( static_cast<unsigned int> ( time( NULL ) ) ); //ランダムに生成
const int maxCount = 100; //最大数
const int maxNumber = 100;
const int magicNumber = maxNumber << 1; //終了を示す値
int* numbers0 = new int[ maxCount ];
generate_n(numbers0, maxCount, [=]()->int{return rand()%maxNumber + 1; });
numbers0[rand()%maxCount] = magicNumber;
int* numbers1 = new int[ maxCount ];
generate_n(numbers1, maxCount, [=]()->int{return rand()%maxNumber + 1; });
numbers1[rand()%maxCount] = magicNumber;
long int sum0, sum1;
// serial execution
sum0 = sum1 = 0;
for ( int i = 0; numbers0[i] != magicNumber; ++i ) sum0 += numbers0[i];
for ( int i = 0; numbers1[i] != magicNumber; ++i ) sum1 += numbers1[i];
cout << sum0 + sum1 << endl;
// parallel execution
sum0 = sum1 = 0;
Concurrency::parallel_invoke(
[&]()->void{ for ( int i = 0; numbers0[i] != magicNumber; ++i ) sum0 += numbers0[i];},
[&]()->void{ for ( int i = 0; numbers1[i] != magicNumber; ++i ) sum1 += numbers1[i];}
); // ほぉら、こんなに簡単♪
cout << sum0 + sum1 << endl;
delete[] numbers0;
delete[] numbers1;
}