thrust

あと,会社でCUDAをラップするthrustというライブラリがあることを教えてもらった.C++STL的なインタフェースを提供してくれるみたい.

これでちゃんとパフォーマンスがでれば,素晴らしいなぁ.(デバイス内の共有メモリをうまく使ったりはできるのかしらん?)

Grand Central Dispatch

Snow Leopardから,Grand Central Dispatch (GCD)というマルチコア用システムが使えるようになったそうな(Web記事).
要するに,

 x = ^{...}

のように{...}で表されるブロックに^を付けることで変数に入れられるようCを拡張して,ブロックをマルチコアで並列に実行するランタイムを提供したもの(キューに突っ込むと並列に実行してくれる),というのが今の所の理解.あってんのかな.

それは,C++0xのラムダ関数ではいかんのか? あと,NSOperationの立場は?
多分,軽いというのと,既存コードに対する変更が少ない,というのが売りなんだろうと想像するけど…

C++の型

C++では,型をclassの中で(typedefで)定義できて,クラス名::型名で参照できる,ということに今更気づいた(というか意識してなかった).vector::iterator it; とかいつも書きながら何を今更,という感じだけど.

あと,vectorとかのコンテナの中では,コンテナ内で保持する値の型が,value_typeとして定義されているので,テンプレートで型としてコンテナを取る場合,その中で保持する値の型を取りたい場合は,typename コンテナ::value_type とかする.typenameは,value_typeが型の名前であることをコンパイラに教えるために必要.

STL使う場合はふつーの話なんだろうけど.ああ,素人くさい.

分散システム 原理とパラダイム 第2版

積読になっていたので,ぱらぱらとめくる.
いや,第1版の和訳も持ってたんだけど,こちらも積読だったんだよねぇ…

中身は,最新の話題も出てきて良い感じ.ちゃんと読んだ訳じゃなくて,ページをめくっただけだけど.グリッドの話題とか,P2P,DHTといった話題もカバーしています.

個々の話題が散発的かなぁという感じもしたけど(P2Pの話題があちこちの章で出てくるとか.まぁ構成上仕方が無いんだろうけど),分散システムの話題はほぼカバーされているので,教科書として良いんじゃないでしょうか.

どうでも良いが,JavaのSerializableが「逐次処理化可能」と訳されていたのはいかがなものか.

C++のテンプレート

今更,色々試してハマる.
テンプレート関数の引数に関数へのポインタを渡す時,関数へのポインタの型から返り値の型とか引数の型とかを推論して欲しいんだけど,って言う話.

template <class Ret(*)(Arg)>
Ret myfunc(Ret(*f)(Arg), Arg a){
  return f(a);
}

とか書いてみたんだけど,動かねー.

とよく考えると,こうだった:

template <class Ret, class Arg>
Ret myfunc(Ret(*f)(Arg), Arg a){
  return f(a);
}

こうすると,

int foo(int a){return a;}

みたいな関数があった場合,

myfunc(foo, 1);

みたいに呼べる.(myfuncとする必要がない.)

C++を普段書いている人には当たり前なんだろうなぁ.
こんなんで,1,2時間はまった.もうじじいなんだろうか.

Parallel Pattern Library

というものが,Visual C++の次期バージョンに取り入れられるらしいことに,今更気づく.
MSDNの記事

こんな感じで書きます:

array<int, 5> values = { 1, 2, 3, 4, 5 };

parallel_for(0U, values.size(), [&values] (size_t i)
{
    values[i] *= 2;
});

[](...){...}がC++で新たに導入されるラムダ関数ですね.
とても,Intel TBBに似ています.というか,C#のTask Parallel Libraryに似ているというべきか.