TBBとラムダ関数
昔,Intel Threading Building Blocks (TBB)がフリーになった時,ちょっと調べて書いたことがありました.その時は,「並列化の手間がかかり過ぎだろう」みたいなことを書いたのですが,CodeZineの紹介記事を見ると,あれ,割と簡潔に書けてる…
parallel_for( blocked_range( 0, Count, 10000 ), [](const blocked_range& range) { /* ループボディ */ } );
のような感じ.あれ,ループボディをoperator()に記述したクラスを作らないといけないんじゃ無かったっけ…? っていうか,(...)って何よ?
というわけで調べてみると,これがかのC++0xで拡張予定のラムダ関数らしい.(引数リスト){...}で,関数オブジェクト(operator()が定義されたクラスのインスタンス)が生成されるそうな.Wikipediaの記述.
で,Intelのコンパイラだと,この記述法がすでに利用できると.なるほど.これならまだマシかなぁ.
そういえば,同時期にC#のTask Parallel Libraryについても紹介したけど,こちらはラムダ関数が使えるから簡潔に書けたのね.っていうか,当時はdelegateを使った記法だったけど.MSDNによると,
Parallel.For(startIndex, endIndex, (currentIndex) => DoSomeWork(currentIndex));
みたいに書けます.(...) => {...}がC#でのラムダ関数の記法というわけですね.
なるほどねぇ.