a21_p01
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* なぜHLシリーズはこんなに高速なのか?
-(by [[K]], 2021.05.14)
** (1)
-HL-16aやHL-22aはJITコンパイラですが、どちらもかなり小さ...
|ページ名|名前|行数|.exeの大きさ|速度のめやす1|速度のめや...
|[[a21_txt02_6a]]|HL-16a|RIGHT:1081行|RIGHT:24.5KB|RIGHT:...
|a21_txt02_12a|HL-22a|RIGHT:1223行|RIGHT:|RIGHT:1.0倍|RIG...
-速度のめやす
--速度のめやす1: 10億回ループをgcc-O3(32bit)でやった場合...
--速度のめやす2: mandel.cをgcc-O3(32bit)でやった場合との...
---ちなみにgcc-O3(64bit)と比較すると、HL-22aでも2%くらい...
-これを実現するために、種もしかけもあるので、それを紹介し...
** (2)
-''[1]'' まず最初に心がけたことは、「高度なことはやらない...
-私は高度なことをやらないで、それでもどこまでできるのか、...
-少ない労力でできて、それいて効果が結構ありそうなことは何...
-''[2]'' 私はその次に構文木を構築しないと決めました。既存...
-構築しなくても簡単なことなら結構いろいろできるのです。も...
-''[3]'' HL-22aは、基本的に「単純で性能が出そうにないアル...
MOV RAX,[b]
ADD RAX,[c]
MOV [tmp],RAX
を出力します。どのレジスタを使ったらいいかとか、そんなの...
MOV RAX,[b]
ADD RAX,[c]
MOV [tmp],RAX
MOV RAX,[tmp]
MOV [a],RAX
を出力するのです。こんな程度なら簡単です。
-''[4]'' でもそれだとさすがに性能が出ません(当然です)。...
MOV RAX,R13
ADD RAX,R14
MOV [tmp],RAX
MOV RAX,[tmp]
MOV R12,RAX
-結局、命令数は全然減っていません。ひどいです。それでもメ...
-''[5]'' さてもっと性能を出す方法はないでしょうか。私は「...
ADD reg,?
-という1命令だけを出力させるようにしました。・・・これは...
-これは特例でしかないので、このパターンに合わなければ相変...
-そしてプログラムの重たいところだけをこの単純な式の組み合...
-私は大いに満足しました。これです、これでいいのです。・・...
-''[6]'' レジスタ変数がうまくいくかどうかは、どの変数をレ...
-だからHL-22aではどの変数をレジスタ変数にしたらいいのか、...
** (3)
-[5]の内容を補足します。
-HL-22aで実行するmandel.cの中にはこんなループがあります。...
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = mul64shr(zx, zx, 24);
yy = mul64shr(zy, zy, 24);
t = xx + yy;
if (t > 0x4000000) break;
zy = mul64shr(zy, zx, 23);
zx = xx + cx;
zy = zy + cy;
zx = zx - yy;
}
sn = sn + n;
-ここで、
if (xx + yy > 0x4000000) break;
とは書かなかったことや、
zy = mul64shr(zy, zx, 23) + cy;
zx = xx - yy + cx;
とは書かなかったところが、ズルを有効活用しているポイント...
-ちなみに xx = mul64shr(zx, zx, 24); は、 xx = (zx * zx) ...
-なお、このプログラムでは、
zx, zy, xx, yy, t, cx, cy
がレジスタ変数になるように指示を与えています。そのため、
xx = mul64shr(zx, zx, 24); // MOV(xx, zx); IMUL(xx, zx);...
yy = mul64shr(zy, zy, 24); // MOV(yy, zy); IMUL(yy, zy);...
t = xx + yy; // MOV(t, xx); ADD(t, yy); //...
if (t > 0x4000000) break; // CMP(t, 0x4000000); JG(labe...
zy = mul64shr(zy, zx, 23); // IMUL(zy, zx); SAR(zy, 23);
zx = xx + cx; // MOV(zx, xx); ADD(zx, cx); ...
zy = zy + cy; // ADD(zy, cy);
zx = zx - yy; // SUB(zx, yy);
という機械語を生成しています。これは二か所のLEA命令の利用...
** (4)
|インタプリタを[3]のレベルのJITコンパイラへ|x86(32bit): +...
|[3]レベルのJITコンパイラを[4]レベルへ改良|x86(32bit): +0...
|[4]レベルのJITコンパイラを[5]レベルへ改良|x86(32bit): +0...
|無駄なメモリアクセスを削減(*1)|x86(32bit): +106行 (HL-14...
|コンパイル時の定数計算|x86(32bit): +053行 (HL-15a→HL-16)...
-*1: MOV [tmp],RAX / MOV RAX,[tmp] のパターンはさすがにひ...
-あとx64ではADDやSUBなどの命令で使える即値は最大で32bitに...
* こめんと欄
#comment
終了行:
* なぜHLシリーズはこんなに高速なのか?
-(by [[K]], 2021.05.14)
** (1)
-HL-16aやHL-22aはJITコンパイラですが、どちらもかなり小さ...
|ページ名|名前|行数|.exeの大きさ|速度のめやす1|速度のめや...
|[[a21_txt02_6a]]|HL-16a|RIGHT:1081行|RIGHT:24.5KB|RIGHT:...
|a21_txt02_12a|HL-22a|RIGHT:1223行|RIGHT:|RIGHT:1.0倍|RIG...
-速度のめやす
--速度のめやす1: 10億回ループをgcc-O3(32bit)でやった場合...
--速度のめやす2: mandel.cをgcc-O3(32bit)でやった場合との...
---ちなみにgcc-O3(64bit)と比較すると、HL-22aでも2%くらい...
-これを実現するために、種もしかけもあるので、それを紹介し...
** (2)
-''[1]'' まず最初に心がけたことは、「高度なことはやらない...
-私は高度なことをやらないで、それでもどこまでできるのか、...
-少ない労力でできて、それいて効果が結構ありそうなことは何...
-''[2]'' 私はその次に構文木を構築しないと決めました。既存...
-構築しなくても簡単なことなら結構いろいろできるのです。も...
-''[3]'' HL-22aは、基本的に「単純で性能が出そうにないアル...
MOV RAX,[b]
ADD RAX,[c]
MOV [tmp],RAX
を出力します。どのレジスタを使ったらいいかとか、そんなの...
MOV RAX,[b]
ADD RAX,[c]
MOV [tmp],RAX
MOV RAX,[tmp]
MOV [a],RAX
を出力するのです。こんな程度なら簡単です。
-''[4]'' でもそれだとさすがに性能が出ません(当然です)。...
MOV RAX,R13
ADD RAX,R14
MOV [tmp],RAX
MOV RAX,[tmp]
MOV R12,RAX
-結局、命令数は全然減っていません。ひどいです。それでもメ...
-''[5]'' さてもっと性能を出す方法はないでしょうか。私は「...
ADD reg,?
-という1命令だけを出力させるようにしました。・・・これは...
-これは特例でしかないので、このパターンに合わなければ相変...
-そしてプログラムの重たいところだけをこの単純な式の組み合...
-私は大いに満足しました。これです、これでいいのです。・・...
-''[6]'' レジスタ変数がうまくいくかどうかは、どの変数をレ...
-だからHL-22aではどの変数をレジスタ変数にしたらいいのか、...
** (3)
-[5]の内容を補足します。
-HL-22aで実行するmandel.cの中にはこんなループがあります。...
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = mul64shr(zx, zx, 24);
yy = mul64shr(zy, zy, 24);
t = xx + yy;
if (t > 0x4000000) break;
zy = mul64shr(zy, zx, 23);
zx = xx + cx;
zy = zy + cy;
zx = zx - yy;
}
sn = sn + n;
-ここで、
if (xx + yy > 0x4000000) break;
とは書かなかったことや、
zy = mul64shr(zy, zx, 23) + cy;
zx = xx - yy + cx;
とは書かなかったところが、ズルを有効活用しているポイント...
-ちなみに xx = mul64shr(zx, zx, 24); は、 xx = (zx * zx) ...
-なお、このプログラムでは、
zx, zy, xx, yy, t, cx, cy
がレジスタ変数になるように指示を与えています。そのため、
xx = mul64shr(zx, zx, 24); // MOV(xx, zx); IMUL(xx, zx);...
yy = mul64shr(zy, zy, 24); // MOV(yy, zy); IMUL(yy, zy);...
t = xx + yy; // MOV(t, xx); ADD(t, yy); //...
if (t > 0x4000000) break; // CMP(t, 0x4000000); JG(labe...
zy = mul64shr(zy, zx, 23); // IMUL(zy, zx); SAR(zy, 23);
zx = xx + cx; // MOV(zx, xx); ADD(zx, cx); ...
zy = zy + cy; // ADD(zy, cy);
zx = zx - yy; // SUB(zx, yy);
という機械語を生成しています。これは二か所のLEA命令の利用...
** (4)
|インタプリタを[3]のレベルのJITコンパイラへ|x86(32bit): +...
|[3]レベルのJITコンパイラを[4]レベルへ改良|x86(32bit): +0...
|[4]レベルのJITコンパイラを[5]レベルへ改良|x86(32bit): +0...
|無駄なメモリアクセスを削減(*1)|x86(32bit): +106行 (HL-14...
|コンパイル時の定数計算|x86(32bit): +053行 (HL-15a→HL-16)...
-*1: MOV [tmp],RAX / MOV RAX,[tmp] のパターンはさすがにひ...
-あとx64ではADDやSUBなどの命令で使える即値は最大で32bitに...
* こめんと欄
#comment
ページ名: