研究日誌。

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

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

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

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (u1low_cheap)
2008-03-01 01:56:15
コメントありがとうございます。

簡単なサンプルを作っては見たのですが、性能向上はほとんど見られませんでした。もちろん実装が良くないせいだと思うのですが、そういった理由も考えられるのですね。

ハードウェアプリフェッチが優秀なのであれば、やはりしっかりアライメントを揃えた方が良いですね。
返信する
Unknown (後藤)
2008-02-29 15:00:52
Core アーキテクチャではほとんどの場合 prefetch 命令の挿入はしなくても大丈夫です。ハードウェアプリフェッチが優秀なのと、手動でプリフェッチを挿入するとロードが妨げられて逆に性能が落ちる場合が多いです。
返信する

コメントを投稿