● ToolBox API徒然草(2006/07/14)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 アプリケーションのUniversal Binary化(その10) 〜


今回から数回に分けて、Universal Binary化における最大の難関(笑)PowerPCのAltiVecコードをIntel CPUのSSE/SSE2コードに変換する作業を解説します。加えて「アプリケーションでAltiVecやSSE/SSE2を利用すべき箇所はどこか?」などについても、色々と考察してみたいと思います。

PowerPCが、画像、映像、サウンド、圧縮伸張、科学演算処理などを高速に実行できるという評判を得ていたのは、その内部にベクトル演算ユニットであるAltiVecを搭載していたからです。AltiVecは、SIMD(Single Instruction Stream Multiple Data Stream)アーキテクチャに分類される演算ユニットです。つまり、単一の命令により複数のデータを同時に処理することができます。AltiVecは、ひとつの命令で4つの浮動小数点(単精度)もしくは4つの整数値(long値)に対して、かけ算や割り算などを効率よく実行することが可能です。そのため、単純な演算を何回も繰り返すような処理(画像フィルタ処理など)には、絶大な威力を発揮します。

例えば、筆者は、CPUの浮動小数点演算を用いていた画像フィルタルーチンをAltiVecコードで書き直した経験があります。この書き直しにより、なんとフィルタ処理速度が7倍も高速になりました。さらに、この処理をマルチCPUに最適化することで、トータルで13倍の処理速度を得ることができました。1.5倍とか2倍でも「おっ、結構速くなったぞ!」と実感できるのですが、13倍となるとまったく別次元となります。逆に言えば、ちゃんとやれば高速化できるのに、AltiVecやマルチCPUに最適化していないため本当の能力を発揮できていないアプリケーションが、世間にはまだまだ沢山あるのも事実です(笑)。

当然、Intel版CPUにはAltiVecは搭載されていませんが、その代わりSSEEと呼ばれるSIMD演算ユニットが搭載されています。SSEは、SSE、SSE2、SSE3といった呼び名が示している通り、CPUが世代交代するのに伴いその命令数を拡張してきました。何やら、次世代のCPU(Core 2 Duo)では、これがSSE4に拡張され、さらなる高速処理が可能になると言った話も聞こえてきます。アプリケーションの処理内容によっては、Universal Binary化する時に、AltiVecコードで高速化していた箇所をSSE/SSE2コードに置き換えないと、Intel環境での処理速度がPowerPC環境と比べて見劣りすることになります。

一番分かり易い例はQuickTimeです。QuickTimeは、画像や映像処理のボトルネックにおいて、AltiVecの能力を最大限に生かしました。当然、Intel版CPU用QuickTimeでは、その代役としてSSE/SSE2を活用していると思われます。ところが、現在のSSE/SSE2はAltiVecよりも命令数も少なく、その速度も優秀ではありません。ちまたで行われているベンチマークを見た時、マルチメディア処理においてはPowerPC G5搭載のMacintoshの方がIntel版より良い結果を示しているのは、こうした理由があるからです。まあ、QuickTimeの最適化がどこまで進んでいるのかも怪しいのですが、開発者が処理速度を稼ぐのに結構苦労している様子がうかがえます。

そんな事情もありますから、何でもかんでもSSE/SSE2に書き直せばOKかと言うと、物事はそんなに簡単ではありません。筆者の経験からすると、最新のIntel版CPU(Core Duo)は、整数処理については同クロックのPowerPC G5より2倍以上高速です。ところが、浮動小数点処理は7割、SIMD処理については5割ぐらいの速度しか出ません。つまり、PowerPCではAltiVecを利用して高速化していた整数処理が、SSE/SSE2に書き換えると、CPU自身の整数処理を使うより遅くなってしまう場合も有り得るわけです(下手くそな記述をすると)。

このように色々と難しい問題もありますが、まずは、Apple社が提供しているAltiVecとSSE/SSE2に関するドキュメントを紹介しておきます。AltiVecコードに精通されており、Universal Binary化においてAltiVecコードをSSE/SSE2コードに変換する作業が必要な方は、まず最初に「AltiVec/SSE Migration Guide」ドキュメントを参照しましょう。と言うより、AltiVecとSSE/SSE2に関する詳しいドキュメントは、これしか存在しません。

「AltiVec/SSE Migration Guide」「Accelerate_sse_migration.pdf」(PDF 44ページ)

http://developer.apple.com/documentation/Performance/Conceptual/Accelerate_sse_migration/index.html

次に紹介するのは、AltiVecやSSE/SSE2を使うことで特定の処理を高速化するために用意されたFrameworkの解説ドキュメントです。これらのFrameworkでは、処理の高速化のためPowerPC用ではAltiVecが、Intel版CPU用ではSSE/SSE2が積極的に使われています。こうしたAPIは「Accelerate.framework」にまとめられており、アプリケーション作成時にこれをリンクすることで、自作ソースコードから呼べるようになります。

このうち、フィルタなどの画像処理関連ルーチンは「Optimizing Image Processing With vImage」ドキュメントで解説されています。また、ベクトル演算やマトリックス演算、そして高速フーリエ変換などについては「vDSP Library」ドキュメントを、その他の多様な演算については「vecLib Framework Reference」ドキュメントを参照してみてください。もし、AltiVecコードでガリガリ記述していた箇所を、こうしたFrameworkのルーチンに差し替えることができれば、SSE/SSE2への書き換えの手間を大幅に削減できるわけです。

「Optimizing Image Processing With vImage」「vImage.pdf」(DF 366ページ)

http://developer.apple.com/documentation/Performance/Conceptual/vImage/index.html

「vDSP Library」「vDSP_Library.pdf」(PDF 73ページ)

http://developer.apple.com/documentation/Performance/Conceptual/vDSP/index.html

「vecLib Framework Reference」「vecLib.pdf」(PDF 111ページ)

http://developer.apple.com/documentation/Performance/Conceptual/vecLib/Reference/reference.html

「vecLib Reference Update」「vecLibRefUpdate.pdf」(PDF 26ページ)

http://developer.apple.com/documentation/Performance/Reference/vecLibRefUpdate/index.html

「Accelerate Reference Updat」「AccelerateRefUpdate.pdf」(PDF 24ページ)

http://developer.apple.com/documentation/Performance/Reference/AccelerateRefUpdate/index.html

次回は、今回紹介した幾つかのトピックスのうち、フィルタなどの画像処理に活用できるvImage.frameworkのルーチンを、例題を示しながら解説したいと思います。


copyright 2006 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp