SSブログ

光学薄膜設計ソフトの設計 その4 ベクタユニット [考え中 - 光学薄膜設計]

設計の続き。

前回ちょっと方針を変えた(始めたばっかりだけど)。
まとめておく。

  • 薄膜光学計算エンジンを書く
  • 計算エンジンはNSOperationのサブクラスとして実装し、マルチコアに対応する
  • NSOperationのサブクラスの計算エンジン単位は当然Thread safeに書かなければいけない
  • 計算エンジン単位はベクタユニットを利用する実装をする

ベクタユニットの利用に関して、AppleのIntroduction to AltiVec/SSE Migration Guideを見てみると、PowerPCのAltivecとx86のSSEとの違いが書いてある。x86ではSSE2以降で64bit doubleの浮動小数点が使える。ベクタレジスタが128bitなので二つしか入らない。

後で整理するつもりだけど、薄膜の光学計算では2×2のマトリクスを使って計算することが多い。ひとつの薄膜の層がひとつのマトリクスに対応し、薄膜の全体の特性はマトリクスの積を計算することで得られる。例えば

#include <Accelerate/Accelerate.h>
typedef	vDouble	thinFilmMatrix[2];
などとすると
	thinFilmMatrix	a;
とすれば単層のマトリクスを宣言できる。ここでvDoubleというのはAccelerate.hで宣言されているベクタデータ型でdoubleが2個はいる。このヘッダで宣言されたデータ型を使うとAltivecとSSEの両方のコードが吐ける。もちろん、Altivecにはdoubleの演算ができないので、コンパイルした結果はスカラユニットでの計算に展開されるが、それ以外のvFloat、vSInt8などは共通に使え、それぞれのベクタ命令に展開される。らしい。

ところが、AppleのライブラリはAltivec時代のまま、あまりアップデートされていない。Appleがサポートするベクタユニットを使うためのライブラリとして
  • vDSP
  • vImage
  • BLAS and LAPACK
  • vForce(vMathLib)
  • vBasicOps
がある。

BLASとLAPACKがそのまま使えるとありがたいのだが、ベクタユニットを使うようになっている(vBLAS.hなど)のはAltivecのままでfloat幅しかサポートしていない。もとのcblas.hヘッダにはdouble用の関数ももちろん定義されているが、SSEのvDoubleに展開されるかどうかはわからない(たぶんスカラユニットを使う普通の命令が生成されるのだろう)。

vDoubleをサポートしているのは古いvDSPと新しいvForceだけ。vForceライブラリはAltivec時代のvMathLibの、三角関数や平方根などの数学関数をベクタユニットを使って計算するlibm互換の関数が宣言されている。floatとdoubleの両方があって、AlitvecとSSEの両方で同じ呼び出しになっている。

もともとvDSPはAltivecでfloatのFFTを効率よく実行するためのライブラリとして始まったが、TigerからdoubleデータのFFTも追加されて、vDSPにはマトリクスの積などの関数もある。vDSP_???Dという名前の最後にDがついているのはdouble精度の浮動小数点を扱う関数になっている。Altivec用のコードはvDSP_???Dは浮動小数点スカラユニットが使われるコードが出力されるようだ。

このvDSPとvForceのライブラリを使えば、とりあえずなんとかなるかも。vForceライブラリはそれほど大きくなくて古いunixの数学関数ライブラリのlibm+math.hにある関数がだいたいあるのでなんとなくわかるけど、vDSPライブラリはAltivecの一番最初からあるライブラリで中途半端に肥大化している。

QuickTimeが典型だが、Appleの古いAPIはどんどんぐちゃぐちゃになる。vDSPはそれほど大きなライブラリではないのにわかりにくい。特に、実はできることはそれほど多くないのに、何ができて何ができないのかがわかりにくい。ドキュメントの問題もあるけど、悪いライブラリの典型のような感じになってる。こういうの、使うのやだな。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立02/27献立02/28 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。