レベル: 中級 土居 意弘 (munepi@jp.ibm.com), IBM Systems & Technology Group, AKD48, IBM
2008年 6月 06日 Cell Broadband Engine (Cell/B.E.) の能力を引き出すために、様々なツールが提供されています。 Assembly Visualizer (asmVis) は、SPU コードがどのようにパイプラインで実行されているかを視覚的に確認し、SPU の性能が引き出されているかを調べるツールです。asmVis を活用してSPUプログラムを最適化する方法を説明します。
Assembly Visualizerの概要
Assembly Visualizer (asmVis) は、SPU のアセンブラコードを解析し命令が実行パイプラインにどのように発行されるかをビジュアルに表示・編集するツールです。 spu_timing の GUI 版と言えますが、さらに優れた機能を持っています。
実行タイミングのグラフィカル表示機能
コンパイラによって生成されたアセンブラ命令が、Even/Odd (イーブン/オド、偶数/奇数の意味) の 2 種類の実行パイプラインで、どのように実行されるかをグラフィカルに表示することができます。
実行順序の編集機能
asmVisでは、アセンブリ命令の順序を前後に入れ替えることで編集を行うことができます。 また、編集が実行タイミングにどのような影響を与えるのかも、ビジュアルに確認することができます。
Enhanced DP 対応
第 3 世代の Cell/B.E. ブレードである QS22 には新しい Cell/B.E. プロセッサである PowerX Cell 8i が搭載されます。PowerX Cell 8i の SPU は倍精度浮動小数点演算が強化されており、完全なパイプライン化がなされます。asmVis では PowerX Cell 8i で実行された場合の実行タイミングもシミュレーションすることができます。
マルチプラットフォーム
asmVis は Swing を利用した Java プログラムでできているため、Windows 環境で実行することも可能です。 ただし、コンパイル時に生成される.sファイルを必要とするため、SDK を導入した Linux 環境とのファイルのやり取りが必要になります。
asmVis の使い方
asmVis のインストールと起動方法
asmVis の実行には Java Runtime Environment (JRE) 6 が必要です。Sun microsystems などのページからダウンロードして導入しましょう。
続いて、asmVis を alphaWorks からダウンロードします。 インストールは簡単です。ダウンロードした asmVisのzip ファイルを適当なディレクトリに展開するだけです。
Linux 環境であれば、次のコマンドを入力して asmVis を起動できます。Windows でも同様のコマンドで実行できます。
プログラムをコンパイルする
次のコードをコンパイルして asmVis を試してみましょう。asmVis で使用できるファイルは .s の拡張子を持つアセンブリファイルのみです。.c ファイルや .o ファイル、実行形式のファイルは読み込めませんので注意しましょう。
リスト 1. add_const.c
#include <inttypes.h>
void add_const(
uint8_t* _outPtr,
int32_t _outStride,
const uint8_t* _in1Ptr,
int32_t _in1Stride,
uint8_t _value,
uint32_t _width,
uint32_t _height)
{
uint32_t x, y;
for (y = 0; y < _height; y++)
{
uint8_t* out = _outPtr;
const uint8_t* in = _in1Ptr;
for (x = 0; x < _width; x++)
{
uint32_t temp;
temp = *in++ + _value;
if ( temp > 255 ) temp = 255;
*out++ = (uint8_t)temp;
}
_outPtr += _outStride;
_in1Ptr += _in1Stride;
}
}
|
.s ファイルを生成します。 add_const.c ファイルと Makefile が存在しているディレクトリで下記のコマンドを実行することで.sファイルを生成できます。
また、Makefile なしでも、次のようにすれば .s ファイルを生成できます (ppc64 プラットフォーム、SDK3.0 の場合)。 SDK のバージョンやプラットフォームにより spu-gcc の場所などが異なりますので、適切に変更しましょう。
$ /usr/bin/spu-gcc -O3 -S add_const.c
|
もし環境変数 SPU_TIMING=1 が設定されていれば、spu_timing が実行されて .s.timing ファイルを生成しますが、asmVis を使用する場合には .s.timing ファイルは特に必要ありません。
基本的画面構成
さて、asmVis を起動して手持ちのソースコードを開いて画面を見てみましょう。
File メニューから Open を選択し、add_const.s ファイルを読み込むと次のような画面が表示されるでしょう。使用するコンパイラやバージョンによって少し内容が異なるかもしれません。
図 1. Assembler Visualizer のメイン画面
画面は大きく 3 つの部分に分かれます。 左側 2 列が、クロックとラベル。ラベルは関数コールやループなどのジャンプ先を指定するために使われます。 残りは半分に分かれて、左からそれぞれ Even パイプラインの実行タイミングと、Odd パイプラインの実行タイミングを表しており、アセンブリ命令語とその命令の実行タイミングが表示されています。 それぞれのパイプラインでは、25:ai$13,$13,-1 や 17:hbrr.L15,.L5 などとアセンブラ命令文が書かれた部分と、下方向へ続く x 印がいくつも書かれた部分にわかれています。Even パイプラインと Odd パイプラインでは左右が逆になっていることに注意してください。
基本的な読み方
10 クロック目 (clks) にある 27:ai$12,$12,1 とは、アセンブリファイルの 27 行目に ai$12,$12,1 (ai は即値とレジスタの和を計算する命令) があるということを意味しています。下方向に続く x 印は、命令が実行開始されるタイミングと完了するまでのサイクル数を表しています。
27:ai$12,$12,1 を再び見てみましょう。このアセンブラ命令と同じ行の左から 10 番目のボックスから x 印が下に 2 つ続いていることが分かります。これは、この ai 命令の実行が完了するまで 2 サイクルかかるということを意味しています。言いかえれば、この ai の実行結果を他の命令で利用するには少なくとも 2 サイクル待たなくてはならない、ということです。
同じ行の Even パイプラインにはもう一つ x 印があります。x 印を上に辿ってみると、25:ai$13,$13,-1 が起点になっていることが分かります。これは Even パイプラインで 2 つの ai 命令をパイプライン実行中であるということを意味しています。同様に Odd パイプラインを見ると 5 つの x 印があり、5 つの命令をパイプライン実行中であるということがわかります。しかし、10 クロック目では Odd パイプラインの列には命令がありませんから、このサイクルでは Odd パイプラインに新しい命令が発行されなかったということも意味しています。
パイプラインストール
11 クロック目の Odd パイプラインにある 28:rotqby$23,$24,$25 では、実行開始のサイクルに|と書かれた赤いボックスが表示されています。 これはパイプラインのストールを意味しています。28:rotqby$23,$24,$25 はその前の 22:lqd$24,0($12) の結果を使用するため、lqd の完了まで実行を開始することができないからです。このような依存関係があることは、lqd の出力レジスタ (一番目のオペランド) と rotqby の入力レジスタ (二番目または三番目のオペランド) に同じ $24 が含まれていることから読み取れます。
パイプラインのストールは、Even と Odd のパイプラインをまたいでも発生します。14 クロック目の 29:andi$21,$23,0x00ff は Even パイプラインで実行されますが、先行して Odd パイプラインで実行されている 28:rotqby$23,$24,$25 の完了まで開始を保留しています。
カラーリング機能、ハイライト機能
asmVis の画面では実にカラフルに命令が表示されていることに気づきます。
Even パイプラインまたは Odd パイプラインの命令をクリックすると、その命令と実行タイミングのx印が黒色の背景に白抜き文字でハイライト表示されます。赤色の背景で表示された命令は、注目命令によってストールする命令、または注目命令をストールさせるような、直接的な依存関係を持つ命令です。灰色の背景で表示された命令は、注目命令と間接的に依存関係を持つ命令です。緑色の背景または青色の背景で表示された命令は、注目命令と順序を入れ替えることができる命令です。命令順序によっては入れ替えることができない場合があるため、これらは表示されないこともあります。黄色の背景は関数内部へのブランチ命令、茶色の背景は他の関数へのブランチまたはリターン命令をそれぞれ表しています。
実行順序の編集機能
asmVis には命令の実行順序を手動で入れ替える機能があります。この機能を使うことで、より実行サイクル数の少ない命令順序を探すためのことができます。実行順序を入れ替えるには、命令を左クリックしてハイライトさせた後、Alt キーを押しながらカーソルキーの上下を押します。命令の依存関係に影響がなければ、画面上で命令が上下に移動し、それと同時に実行タイミングの x 印も移動するはずです。これにより、コンパイラが生成したコードよりもプログラム全体の実行クロック数の少ない、パイプラインのストールがより少ない適切な実行順序を探すことができるかもしれません。よりよい結果を見つけたならば、結果を File メニューからアセンブリファイルとして保存して、次からはこのアセンブリファイルからオブジェクトコードを生成させることができます。
ただし、asmVis を使って命令を追加したり削除することはできません。アセンブリファイルに予め記述されている命令のみが有効です。命令を変更したい場合は、C/C++/Fortran のソースコードを編集してアセンブリファイルを再び生成します。アセンブリファイルを直接変更することもできますが、命令順序とレジスタ番号の依存関係とに注意して記述する作業はかなり難しい仕事になるでしょう。
次回に向けて:高速なプログラムとは
さてここまでの説明で、asmVis は命令の実行順序と依存関係を解析し、Even パイプラインで実行される命令は左から、Odd パイプラインで実行される命令は右から、それぞれ中央に向かってタイミングとともに分かりやすく表示してくれるツールであることがわかりました。
さらに、Even パイプラインと Odd パイプラインの両方でストールがなく毎クロック命令が発行されている状態であれば、全体的にはV字型に x 印が並ぶことがわかるでしょう。V 字が綺麗に表示されているほど SPU の性能を最大限引き出しているプログラムということが言えるわけです。
次回は、SPU の性能をできる限り引き出す(つまり、asmVis 上に表示されたコードがよい V 字を形作るような)コードを書くためのテクニックを紹介します。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | 土居 意弘はこれまで 5 年間プロのソフトウェア開発者として活躍していますが、アマチュアのフリーソフト作者としても 10 年以上の経験があります。現在は日本IBMのテクニカルエキスパートとして、Cell/B.E. 向けソフトウェアの実装やアーキテクト、トレーニング講師などを行っています。今はプログラムを書くのが仕事になりましたが、初めてパソコンを触った時は何に使うものかさっぱりわかりませんでした (ナショナル JR100 でした) 。 |
記事の評価
|