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#でのラムダ関数の記法というわけですね.

なるほどねぇ.