SSブログ

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)
などが使える(PowerPCの場合doubleは使えない)。ただし、図-1のようにベクタレジスタが128ビットなので8ビット整数(charなど)はいっぺんに16個処理できるけど、倍精度浮動小数点数は2個しか同時処理できないということになる。

0809fig1.png

もちろん構造体などは使えない。従って複素数に対してそのままで使うことはできない。また、8ビット整数を8個使って、残った64ビットを単精度小数2個に、などという混在はできない。

それでもスカラユニットでやるよりは速いし、スカラユニットに別のことをやらせることができるようになる(もちろん、メモリアクセスがボトルネックになるのが普通なので、使い切ることができるのはまれだけど)。

できる計算の主だったものを上げると

  • 論理演算
  • ローテートなど
  • 四則演算、一部の複合演算(かけた後、別のを足すとか)
  • 平方根、exp、Logなどごく一部の関数
  • 比較
  • 平均や最大最小
  • 入れ替え
などができる。PowerPCとIntelでできることとできないことが細かいところでは違っている。また、丸めの方法や、denormal(小さすぎる数)浮動小数点数の扱いなども微妙に違いがある。

たくさんのデータに対して同じ計算をしたい、という場合に威力を発揮する。

vDSPライブラリ

ところがアセンブラはもちろん、ベクタユニットのCインターフェイスもあまり使い勝手がよくない。つまり

  • ほぼベクタ命令と1対1に対応するC関数だけしか用意されていない
  • かならずデータを128ビットぶんまとめなければならない
  • PowerPCとIntelでコードを書き分けなければいけない
  • となっている。

特に、並列に処理したいデータはたくさんあるのが普通で場合によっては数MB単位になることもある。ところがそれもかならず128ビットをひとまとめにして、さらにパックして(メモリ上で詰めて)順番に処理しなければならない。また、Fourier変換など中間結果が複素数になる場合にも自分でそれにふさわしい命令を組み合わせなければならない。これは非常に煩わしい。

そこでvDSPの登場である。vDSPは

  • 任意個数で、パックされていない配列に対してベクタユニットを使う命令に展開する
  • アーキテクチャの違いをなるべく吸収して、同じコードが両方のアーキテクチャで使えるようにする
  • 基本演算に加えて、ベクタユニットを使うアプリケーションで比較的よく必要になる演算も含まれる
というCから呼べるライブラリである。名前の通り、音声処理や画像処理などいわゆるDigital Signal Processingを行いたい場合に便利な機能を持っている。

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
などが一緒に含まれている。どれもベクタユニットを使うためのライブラリである。LAPACKは標準的には/usr/lib/にあるはずだけど、MacOS Xではこのフレームワークの中の本体へのシンボリックリンクになっている。中にはまた使うことになるだろうと思えるものもあるのでそのときはまたそれに関するメモを作ろう。

vDSPでなにができるか、は次にしよ。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

Iona「Live in London」献立08/10 ブログトップ

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