vDSPについてのメモ [プログラミング - vDSPメモ]
仕事しているなかで、あるデータを取りたくてちょっとまたIIDCカメラから光強度を取り込むソフトを書いた。計算量が多めで、しかも本社から持ってきた古いG4マシンしかないせいで、一つの画像に対する処理が1フレーム以内に終わらなくてフレーム落ちした。それ自身は今回の目的には支障ないのだけれどフレーム落ちするとどうしても使い勝手が悪くなってしまう。
そこでベクタユニットを使うコードを書いてみた。 またすぐ忘れるので、今回勉強したところについてのメモを残しておく。
実は、今回の仕事に使うデータ取りはたまたまvDSPを使ってそれなりにうまくいった(実際にフレーム落ちを減らすことができた。無くなりはしなかったが)けど、このメモを書くためにそのコードをうちに持って帰ってきてIntel iMacでベンチマークをしてみたところ、なんとも情けないと言うか、おもしろいことが明らかになった。メモの最後にその話を書いておくつもり。
Accelerateフレームワーク
今回使ったのはMac OSXのvDSPというライブラリで、 /System/Library/Framworks/Accelerate.framework といういわゆるアンブレラフレームワークの中に統合されている。このフレームワークはベクタユニットを使うためのフレームワークで、Developer向けにフレームワーク全体の簡単な導入記事がある。また、ターミナルから
# man Accelerateであらましが表示される。LAPACKをmanしても同じものが表示される。
vDSPとは
ベクタユニット
PowerPCならAltiVec、Intelのx86ならSSEというベクタユニットがCPUに内蔵されている。ベクタユニットとは複数のデータに対して同時に計算を行うことができるユニットで、限られた形式の計算しかできないけど、うまく使いこなせればCPU本体と平行して計算を走らせることができる。
ただし、多くの制限があって
- 同時に計算できるのは、ベクタレジスタに入る最大128ビットぶんまで
- ほとんどの場合、異なるデータに対して同じ処理をする計算に限られる
- できる処理は四則演算など基本的なものに限られる
Cで使われる単純型のデータタイプはほぼサポートされる。つまり
- 8、16、32ビット整数、符号なし整数
- 単精度浮動小数点数(float)
- 倍精度浮動小数点数(double)
もちろん構造体などは使えない。従って複素数に対してそのままで使うことはできない。また、8ビット整数を8個使って、残った64ビットを単精度小数2個に、などという混在はできない。
それでもスカラユニットでやるよりは速いし、スカラユニットに別のことをやらせることができるようになる(もちろん、メモリアクセスがボトルネックになるのが普通なので、使い切ることができるのはまれだけど)。
できる計算の主だったものを上げると
- 論理演算
- ローテートなど
- 四則演算、一部の複合演算(かけた後、別のを足すとか)
- 平方根、exp、Logなどごく一部の関数
- 比較
- 平均や最大最小
- 入れ替え
たくさんのデータに対して同じ計算をしたい、という場合に威力を発揮する。
vDSPライブラリ
ところがアセンブラはもちろん、ベクタユニットのCインターフェイスもあまり使い勝手がよくない。つまり
- ほぼベクタ命令と1対1に対応するC関数だけしか用意されていない
- かならずデータを128ビットぶんまとめなければならない
- PowerPCとIntelでコードを書き分けなければいけない となっている。
特に、並列に処理したいデータはたくさんあるのが普通で場合によっては数MB単位になることもある。ところがそれもかならず128ビットをひとまとめにして、さらにパックして(メモリ上で詰めて)順番に処理しなければならない。また、Fourier変換など中間結果が複素数になる場合にも自分でそれにふさわしい命令を組み合わせなければならない。これは非常に煩わしい。
そこでvDSPの登場である。vDSPは
- 任意個数で、パックされていない配列に対してベクタユニットを使う命令に展開する
- アーキテクチャの違いをなるべく吸収して、同じコードが両方のアーキテクチャで使えるようにする
- 基本演算に加えて、ベクタユニットを使うアプリケーションで比較的よく必要になる演算も含まれる
vDSPを使うには
#include <Accelerate/Accelerate.h>アンブレラフレームワーク全体を、あるいはvDSPだけを
#include <vecLib/vDSP.h>としてヘッダをインクルードし、Xcodeプロジェクトに
/System/Library/Frameworks/Accelerate.frameworkフレームワークを追加する。 Accelerateフレームワークには
- vDSP
- vImage
- vMathLib
- vForce
- vBasicOps
- vBigNum
- LAPACKとBLAS
vDSPでなにができるか、は次にしよ。
コメント 0