VC++10(VS2010)では、 Parallel Pattern Library (PPL) というのが提供されます。
これは並列処理を行うためのライブラリです。
インクルードするのは
まず、 std::for_each の並列処理版である parallel_for_each
template <typename InputIterator, typename Function> Function parallel_for_each(InputIterator first, InputIterator last, Function func); // ※本当は _Input_iterator _First, ... のようになってますが、読みやすいように勝手に直してます。
#include <iostream> #include <vector> #include <ppl.h> using namespace std; using namespace Concurrency; int main() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } parallel_for_each(v.begin(), v.end(), [](int i) { cout << i << endl; }); }
5 6 7 8 9 0 1 2 3 4
順番を気にせず、高速に全要素を処理を行いたい場合は役立つでしょう。
次に、 for文に相当する並列処理関数 parallel_for
template <typename IndexType, typename Function> Function parallel_for(IndexType first, IndexType last, IndexType step, Function func);
#include <iostream> #include <vector> #include <ppl.h> using namespace std; using namespace Concurrency; int main() { vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } parallel_for(0, 10, 1, [](int i) { cout << i << endl; }); // for (int i = 0; i < 10; i += 1) と同じ }
8 9 5 6 7 3 4 0 1 2
あとは、複数の関数を並列的に実行する parallel_invoke
template <typename... Functions> void parallel_invoke(Functions&... funcs); // ※VC++10 CTP時点では可変引数テンプレートではなく Function1 〜 Function10 のオーバーロードを作成しています
#include <iostream> #include <array> #include <functional> #include <ppl.h> using namespace std; using namespace std::tr1; using namespace Concurrency; int main() { array<function<void()>, 5> f = { []{ cout << 1 << endl; }, []{ cout << 2 << endl; }, []{ cout << 3 << endl; }, []{ cout << 4 << endl; }, []{ cout << 5 << endl; } }; parallel_invoke(f[0], f[1], f[2], f[3], f[4]); }
5 4 3 2 1
他にもいろいろあるみたいなので、わかったらまた書きます