ToDo:
適当に kik さんのコードを GCC にコンパイルさせた結果を 僕のアセンブリ再配置マッシーンにかけてみたら遅くなった。 まぁ GCC は意図があってというか 命令の配置と協調してレジスタ配置してるわけで、 レジスタ配置を固定して命令配置いじっても速くはならんわなぁ…と。
で GCC の吐いたコードを仮想レジスタ作って SSA にしてみて (レジスタ1000個くらい必要だった)、 それを適当なヒューリスティックスで 実際のレジスタ割付しながら命令を配置していくものを書いてみたら、 レジスタ250本くらい必要だった上にさらに遅くなった。
GCC は偉いなぁと思うと同時に、 問題のドメインを理解してる人間による レジスタ配置は最強だなぁと思った。
じゃあ表題の倍率は何かというと、 volatile つけたら速くなった ⊂( '-')⊃
--- mt_mine_orig.c 2009-05-18 06:49:16.000000000 +0900 +++ mt_mine.c 2009-05-18 06:55:06.000000000 +0900 @@ -86,6 +86,7 @@ } typedef vector unsigned long vul; +typedef volatile vector unsigned long vvul; typedef vector unsigned char vub; static vul mt_bs[32][5] __attribute__((aligned(16))); @@ -166,39 +167,39 @@ }; vul sum = {0, 0, 0, 0}; - vul s0_0 = mt_bs[0][3]; - vul s0_1 = mt_bs[1][3]; - vul s0_2 = mt_bs[2][3]; - vul s0_3 = mt_bs[3][3]; - vul s0_4 = mt_bs[4][3]; - vul s0_5 = mt_bs[5][3]; - vul s0_6 = mt_bs[6][3]; - vul s0_7 = mt_bs[7][3]; - vul s0_8 = mt_bs[8][3]; - vul s0_9 = mt_bs[9][3]; - vul s0_10 = mt_bs[10][3]; - vul s0_11 = mt_bs[11][3]; - vul s0_12 = mt_bs[12][3]; - vul s0_13 = mt_bs[13][3]; - vul s0_14 = mt_bs[14][3]; - vul s0_15 = mt_bs[15][3]; - vul s0_16 = mt_bs[16][3]; - vul s0_17 = mt_bs[17][3]; - vul s0_18 = mt_bs[18][3]; - vul s0_19 = mt_bs[19][3]; - vul s0_20 = mt_bs[20][3]; - vul s0_21 = mt_bs[21][3]; - vul s0_22 = mt_bs[22][3]; - vul s0_23 = mt_bs[23][3]; - vul s0_24 = mt_bs[24][3]; - vul s0_25 = mt_bs[25][3]; - vul s0_26 = mt_bs[26][3]; - vul s0_27 = mt_bs[27][3]; - vul s0_28 = mt_bs[28][3]; - vul s0_29 = mt_bs[29][3]; - vul s0_30 = mt_bs[30][3]; - vul s0_31 = mt_bs[31][3]; - vul t0_0 = mt_bs[0][4]; + vvul s0_0 = mt_bs[0][3]; + vvul s0_1 = mt_bs[1][3]; + vvul s0_2 = mt_bs[2][3]; + vvul s0_3 = mt_bs[3][3]; + vvul s0_4 = mt_bs[4][3]; + vvul s0_5 = mt_bs[5][3]; + vvul s0_6 = mt_bs[6][3]; + vvul s0_7 = mt_bs[7][3]; + vvul s0_8 = mt_bs[8][3]; + vvul s0_9 = mt_bs[9][3]; + vvul s0_10 = mt_bs[10][3]; + vvul s0_11 = mt_bs[11][3]; + vvul s0_12 = mt_bs[12][3]; + vvul s0_13 = mt_bs[13][3]; + vvul s0_14 = mt_bs[14][3]; + vvul s0_15 = mt_bs[15][3]; + vvul s0_16 = mt_bs[16][3]; + vvul s0_17 = mt_bs[17][3]; + vvul s0_18 = mt_bs[18][3]; + vvul s0_19 = mt_bs[19][3]; + vvul s0_20 = mt_bs[20][3]; + vvul s0_21 = mt_bs[21][3]; + vvul s0_22 = mt_bs[22][3]; + vvul s0_23 = mt_bs[23][3]; + vvul s0_24 = mt_bs[24][3]; + vvul s0_25 = mt_bs[25][3]; + vvul s0_26 = mt_bs[26][3]; + vvul s0_27 = mt_bs[27][3]; + vvul s0_28 = mt_bs[28][3]; + vvul s0_29 = mt_bs[29][3]; + vvul s0_30 = mt_bs[30][3]; + vvul s0_31 = mt_bs[31][3]; + vvul t0_0 = mt_bs[0][4]; vul t0_1 = mt_bs[1][4]; vul t0_2 = mt_bs[2][4]; vul t0_3 = mt_bs[3][4];
(07:01)
プログラム書いてる子は自然言語処理系のもの書くのが 難しいことを知ってるからあまりその手のものを バカにしたりはしないんじゃないかと思う。 でもコンパイラが難しいことを知ってるのに GCC をバカだと言ってしまうのは。 レジスタ配置で負けたので反省しないといけない
(07:06)
前 | 2009年 5月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。
volatileすげー。コンテスト中はそんな発想は全くなかったからなあ…
VHDLみたいだといわれたコードがこんなところで役に立つとは思ってなかった
そういえばコード生成のスクリプトとかっていただけませんでしょうか。それいじって asm 吐くように頑張れば限界が見れそうなので、もし暇があればやってみようかなとか思うのですが。
http://as305.dyndns.org/~kik/public/htc-gen.tgz
これだと思う。自信ないけど(ぉ