研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

インライン・アセンブラ。

2008-02-25 18:00:13 | Weblog
前回の Penryn コアでの実験結果より、最短路ソルバーではキャッシュサイズが大きさが実行時間に大きく関与しているようである。キャッシュ利用がうまくできれば、より高速化できる見込みがありそうだ。ソフトウェア・プリフェッチを行いたいので、最近はインライン・アセンブラについて調べてみている。アセンブラは今回初めて触ったのだが、いまだによく分からないことが多い。



まとめると、アセンブリ言語には AT&T(gcc)、Intel(icc) と2種類の形式があり、つぎのように命令の方向が異なるので注意が必要である。
[AT&T]
 asm ("命令 source, dest");

[Intel]
 asm {命令 dest source};



拡張機能を用いれば、次のように変数名をそのまま用いる事が出来る。単純な足し算を行う関数の例では次のようになる。

 asm (アセンブリコード : 出力オペランド : 入力オペランド : 破壊レジスタ);

int add_test (int a, int b) {
 int tmp;
 tmp = a + b;
 return tmp;
}

int add_test_asm (int a, int b) {
 int tmp;
 asm ("add %1, %2" : "=r"(tmp) : "r" (a) ,"r" (b));
 return tmp;
}



実装する際にはダイクストラ法のループに、次の探索点になりそうなデータをプリフェッチするコードを埋め込むことになるだろう。

ary[i] をプリフェッチするためには、次のようなコードを埋め込めばよいようだ。

asm("prefetcht0 %0" : : "m" (ary[i]) : "memory");

また、プリフェッチ命令には次の4種類があるが、これもいろいろ試してみる必要がありそうである。
・prefetcht0
・prefetcht1
・prefetcht2
・prefetchnta



[参考]
IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
http://www.yuasa.kuis.kyoto-u.ac.jp/~yasugi/4/k2.html
http://yashiromann.sakura.ne.jp/memo/GCC-Inline-Assembly-HOWTO.html
http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html
http://7ujm.net/linux/asm.html