光学薄膜設計ソフトの設計 その3 NSOperation [考え中 - 光学薄膜設計]
突然こないだから始めた新しい設計の続き。
前回では、おまけのプログラミングの勉強として計算を分割してthreadを割り振り、マルチコアを使い切ろうと思っていた。Leopardの「Threading Programing Topic」を眺めていて、「Multi-threadは大変だよ、ほらこんなこともある、あんなこともある...」と書いてあるように見えてめんどくさそうだなあ、と思っていたら、NSOperationとNSOperationQueueというのがあってマルチコアを使ったthreadプログラミングをカプセル化してくれるようなことが書いてある。これはLeopardから導入されたFoundation Frameworkの新しいクラスらしい。
このガイドだけ読んでもピンとこないけど、どうやらNSOperationの計算の単位になるサブクラスを作って、お互い干渉しないNSOperationをたくさん用意してそれをNSOperationQueueに投入してstartメソッドを送ると内部でthreadに割り振ってくれるらしい。
当然ひとつのNSOperationのサブクラスはthread safeに書かなければいけないので、明示的にthreadを使うのよりどのくらいメリットがあるのかわからないけど、研究してみる価値はありそう。
ついでに今回の計算は、ベクタユニットを使ってみよう。PowerPC時代のaltivecユニットは浮動小数点に関してfloatしかサポートしてなかったので、表示のためにvDSPというライブラリのFFTを使った(これもすぐにfftwに取り替えてしまった)ぐらいで、数値計算のプログラミングをする上であまりありがたみを感じたことはなかった。
IntelのCPUはどうやらdoubleもベクタユニットで使えるらしい。ベクタレジスタが128ビット幅なのでdoubleは2個しか入らないけど、それでもざっくり計算速度は倍になるだろう。スループットがスカラユニットと同じとしてだけど。
今回の計算に本当にdouble幅が必要なのかどうか、ちゃんと計算精度を追っかけてみよう。ひょっとするとfloatでも十分な所があるのではないか、もしその場合にはベクタユニットでfloatで計算すればずいぶん速くなるはず。
それにしてもIntelのCPUは何がなんだか良くわからない。ベクタユニットの種類だけでもMMX、SSE、SSE2、SSE3、などとあるらしいし、Appleがまだサポートしていないのがさらにもっとあるらしい。信じられん。互換性とかどうなってんの?
コメント 0