Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 102:66688fe44eb1
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 Feb 2019 16:38:35 +0900 |
parents | 5b837bd92f85 |
children | e2bd6398aae9 |
files | presen/slide.html presen/slide.md presen/slide.pdf presen/slide.pdf.html |
diffstat | 4 files changed, 349 insertions(+), 194 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/slide.html Tue Feb 19 16:06:53 2019 +0900 +++ b/presen/slide.html Tue Feb 19 16:38:35 2019 +0900 @@ -300,13 +300,13 @@ <ul> <li>マクロ<code>DISPATCH</code>は, ラベルgotoが利用できる場合は無視される</li> - <li>マクロ <code>OP</code> が, 対応するバイトコード命令を, ラベル列に変換する</li> + <li>マクロ <code>OP</code> が, バイトコードの名前をC言語のラベルに変換する</li> </ul> <pre><code> OP_const_i16: - OP_const_i32: - MVM_exception_throw_adhoc(tc, "const_iX NYI"); - OP_const_i64: +</code></pre> + +<pre><code> #OP_const_i16 </code></pre> @@ -318,9 +318,12 @@ <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> <ul> - <li>次のバイトコード命令に遷移するマクロ <code>NEXT</code> は, ラベルgotoが使用可能な場合次の様に記述されている</li> - <li><code>NEXT</code>自体はラベルテーブルにアクセスし, ラベルを取り出す</li> - <li>次のバイトコードを取り出すのは, <code>NEXT_OP</code> というマクロが担っている</li> + <li><code>NEXT</code>自体はラベルテーブルにアクセスし, ラベルを取り出す + <ul> + <li>取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る</li> + </ul> + </li> + <li>次の命令を計算する処理は, <code>NEXT_OP</code> というマクロが担っている</li> </ul> <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) @@ -329,6 +332,7 @@ </code></pre> <ul> <li>マクロ <code>NEXT</code> は次の様に展開される</li> + <li>これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする</li> </ul> <pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; @@ -376,7 +380,7 @@ <ul> <li>Cの実装の場合, switch文に展開される可能性がある <ul> - <li>命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない</li> + <li>命令ディスパッチが書かれているCソースファイルの指定の場所にのみ処理を記述せざるを得ない</li> <li>1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない</li> </ul> </li> @@ -583,10 +587,68 @@ <ul> <li>CbCMoarVMと通常のMoarVMの速度比較を行った</li> - <li>対象として, 単純なループで数値をインクリメントする例題と, フィボナッチ数列を求める例題を選択した</li> - <li>NQPで実装し, 速度を計測した</li> + <li>NQPで実装した2種類の例題を用いた + <ul> + <li>単純なループで数値をインクリメントする例題</li> + <li>再帰呼び出しを用いてフィボナッチ数列を求める例題</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="フィボナッチの例題">フィボナッチの例題</h2> + +<pre><code>#! nqp + +sub fib($n) { + $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +} + +my $N := 30; +my $z := fib($N); +say("fib($N) = " ~ fib($N)); +</code></pre> + +<ul> + <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> </ul> +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>1.379</td> + <td>1.350</td> + <td>1.346</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>1.636</td> + <td>1.804</td> + <td>1.787</td> + </tr> + </tbody> +</table> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="単純ループ">単純ループ</h2> + <pre><code>#! nqp my $count := 100_000_000; @@ -597,70 +659,54 @@ } </code></pre> -<pre><code>#! nqp - -sub fib($n) { - $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +<style type="text/css"> +table , td, th { + border: 2px solid #595959; + border-collapse: collapse; +} +td, th { + padding: 12px; + width: 120px; + height: 40px; } - -my $N := 30; - -my $z := fib($N); - -say("fib($N) = " ~ fib($N)); - -</code></pre> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="フィボナッチの例題">フィボナッチの例題</h2> +th { + background: #f0e6cc; +} +.even { + background: #fbf8f0; +} +.odd { + background: #fefcf9; +} +</style> <ul> - <li>オリジナル - <ul> - <li>1.379 sec</li> - <li>1.350 sec</li> - <li>1.346 sec</li> - </ul> - </li> - <li>CbCMoarVM - <ul> - <li>1.636 sec</li> - <li>1.804 sec</li> - <li>1.787 sec</li> - </ul> - </li> - <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> + <li>単純ループの場合は1.5secほど高速化した</li> + <li>これは実行する命令コードが、 CPUのキャッシュに収まった為であると考えられる</li> </ul> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="単純ループ">単純ループ</h2> - -<ul> - <li>オリジナル - <ul> - <li>7.499 sec</li> - <li>7.844 sec</li> - <li>6.746 sec</li> - </ul> - </li> - <li>CbCMoarVM - <ul> - <li>6.135 sec</li> - <li>6.362 sec</li> - <li>6.074 sec</li> - </ul> - </li> - <li>単純ループではCbCMoarVMの方が高速に動作する場合もある</li> -</ul> +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>7.499</td> + <td>7.844</td> + <td>7.822</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>6.135</td> + <td>6.362</td> + <td>6.074</td> + </tr> + </tbody> +</table> @@ -704,13 +750,17 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="まとめと今後の課題">まとめと今後の課題</h2> +<h2 id="まとめ">まとめ</h2> <ul> - <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した</li> - <li>CbCの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化する事が出来た</li> + <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した + <ul> + <li>Cの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化が可能となった</li> + <li>CPUキャッシュに収まるループなどの命令の場合は、 通常のMoarVMよりも高速に動作する</li> + </ul> + </li> + <li>今後はCodeGearの特性を活用し、 直接次の命令を実行する処理を実装する</li> </ul> - </div>
--- a/presen/slide.md Tue Feb 19 16:06:53 2019 +0900 +++ b/presen/slide.md Tue Feb 19 16:38:35 2019 +0900 @@ -125,21 +125,22 @@ ``` - マクロ`DISPATCH`は, ラベルgotoが利用できる場合は無視される -- マクロ `OP` が, 対応するバイトコード命令を, ラベル列に変換する +- マクロ `OP` が, バイトコードの名前をC言語のラベルに変換する ``` OP_const_i16: - OP_const_i32: - MVM_exception_throw_adhoc(tc, "const_iX NYI"); - OP_const_i64: +``` + +``` + #OP_const_i16 ``` ## MVM_interp_runで使用されているマクロ -- 次のバイトコード命令に遷移するマクロ `NEXT` は, ラベルgotoが使用可能な場合次の様に記述されている - `NEXT`自体はラベルテーブルにアクセスし, ラベルを取り出す -- 次のバイトコードを取り出すのは, `NEXT_OP` というマクロが担っている + - 取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る +- 次の命令を計算する処理は, `NEXT_OP` というマクロが担っている ``` #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) @@ -147,6 +148,7 @@ ``` - マクロ `NEXT` は次の様に展開される +- これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする ``` goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; @@ -181,7 +183,7 @@ ## MVM_interp_run - Cの実装の場合, switch文に展開される可能性がある - - 命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない + - 命令ディスパッチが書かれているCソースファイルの指定の場所にのみ処理を記述せざるを得ない - 1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない - 高速化手法の、 Threaded Codeの実装を考えた場合, この命令に対応して大幅に処理系の実装を変更する必要がある. - デバッグ時には今どの命令を実行しているか, ラベルテーブルを利用して参照せざるを得ず, 手間がかかる. @@ -322,8 +324,53 @@ ## CbCMoarVMと通常のMoarVMの比較 - CbCMoarVMと通常のMoarVMの速度比較を行った -- 対象として, 単純なループで数値をインクリメントする例題と, フィボナッチ数列を求める例題を選択した -- NQPで実装し, 速度を計測した +- NQPで実装した2種類の例題を用いた + - 単純なループで数値をインクリメントする例題 + - 再帰呼び出しを用いてフィボナッチ数列を求める例題 + + +## フィボナッチの例題 + +``` +#! nqp + +sub fib($n) { + $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +} + +my $N := 30; +my $z := fib($N); +say("fib($N) = " ~ fib($N)); +``` + + +- フィボナッチの例題ではCbCMoarVMが劣る結果となった + +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>1.379</td> + <td>1.350</td> + <td>1.346</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>1.636</td> + <td>1.804</td> + <td>1.787</td> + </tr> + </tbody> +</table> + + +## 単純ループ ``` #! nqp @@ -336,45 +383,52 @@ } ``` -``` -#! nqp - -sub fib($n) { - $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +<style type="text/css"> +table , td, th { + border: 2px solid #595959; + border-collapse: collapse; +} +td, th { + padding: 12px; + width: 120px; + height: 40px; } - -my $N := 30; - -my $z := fib($N); - -say("fib($N) = " ~ fib($N)); - -``` -## フィボナッチの例題 +th { + background: #f0e6cc; +} +.even { + background: #fbf8f0; +} +.odd { + background: #fefcf9; +} +</style> -- オリジナル - - 1.379 sec - - 1.350 sec - - 1.346 sec -- CbCMoarVM - - 1.636 sec - - 1.804 sec - - 1.787 sec -- フィボナッチの例題ではCbCMoarVMが劣る結果となった - +- 単純ループの場合は1.5secほど高速化した +- これは実行する命令コードが、 CPUのキャッシュに収まった為であると考えられる -## 単純ループ - -- オリジナル - - 7.499 sec - - 7.844 sec - - 6.746 sec -- CbCMoarVM - - 6.135 sec - - 6.362 sec - - 6.074 sec - -- 単純ループではCbCMoarVMの方が高速に動作する場合もある +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>7.499</td> + <td>7.844</td> + <td>7.822</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>6.135</td> + <td>6.362</td> + <td>6.074</td> + </tr> + </tbody> +</table> ## CbCMoarVMの利点 @@ -392,7 +446,8 @@ - CodeGearを単位として用いる事で複雑なプログラミングが要求される. -## まとめと今後の課題 +## まとめ - 継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した -- CbCの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化する事が出来た - + - Cの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化が可能となった + - CPUキャッシュに収まるループなどの命令の場合は、 通常のMoarVMよりも高速に動作する +- 今後はCodeGearの特性を活用し、 直接次の命令を実行する処理を実装する
--- a/presen/slide.pdf.html Tue Feb 19 16:06:53 2019 +0900 +++ b/presen/slide.pdf.html Tue Feb 19 16:38:35 2019 +0900 @@ -284,13 +284,13 @@ <ul> <li>マクロ<code>DISPATCH</code>は, ラベルgotoが利用できる場合は無視される</li> - <li>マクロ <code>OP</code> が, 対応するバイトコード命令を, ラベル列に変換する</li> + <li>マクロ <code>OP</code> が, バイトコードの名前をC言語のラベルに変換する</li> </ul> <pre><code> OP_const_i16: - OP_const_i32: - MVM_exception_throw_adhoc(tc, "const_iX NYI"); - OP_const_i64: +</code></pre> + +<pre><code> #OP_const_i16 </code></pre> @@ -302,9 +302,12 @@ <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2> <ul> - <li>次のバイトコード命令に遷移するマクロ <code>NEXT</code> は, ラベルgotoが使用可能な場合次の様に記述されている</li> - <li><code>NEXT</code>自体はラベルテーブルにアクセスし, ラベルを取り出す</li> - <li>次のバイトコードを取り出すのは, <code>NEXT_OP</code> というマクロが担っている</li> + <li><code>NEXT</code>自体はラベルテーブルにアクセスし, ラベルを取り出す + <ul> + <li>取り出したNEXTはラベルなので、 ラベルgotoの拡張が実装されている場合はgoto文でジャンプ出来る</li> + </ul> + </li> + <li>次の命令を計算する処理は, <code>NEXT_OP</code> というマクロが担っている</li> </ul> <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) @@ -313,6 +316,7 @@ </code></pre> <ul> <li>マクロ <code>NEXT</code> は次の様に展開される</li> + <li>これは現在のバイトコードを指すポインタをインクリメントし、 命令に対応する変数に代入をする</li> </ul> <pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)]; @@ -360,7 +364,7 @@ <ul> <li>Cの実装の場合, switch文に展開される可能性がある <ul> - <li>命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない</li> + <li>命令ディスパッチが書かれているCソースファイルの指定の場所にのみ処理を記述せざるを得ない</li> <li>1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない</li> </ul> </li> @@ -567,10 +571,68 @@ <ul> <li>CbCMoarVMと通常のMoarVMの速度比較を行った</li> - <li>対象として, 単純なループで数値をインクリメントする例題と, フィボナッチ数列を求める例題を選択した</li> - <li>NQPで実装し, 速度を計測した</li> + <li>NQPで実装した2種類の例題を用いた + <ul> + <li>単純なループで数値をインクリメントする例題</li> + <li>再帰呼び出しを用いてフィボナッチ数列を求める例題</li> + </ul> + </li> +</ul> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="フィボナッチの例題">フィボナッチの例題</h2> + +<pre><code>#! nqp + +sub fib($n) { + $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +} + +my $N := 30; +my $z := fib($N); +say("fib($N) = " ~ fib($N)); +</code></pre> + +<ul> + <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> </ul> +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>1.379</td> + <td>1.350</td> + <td>1.346</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>1.636</td> + <td>1.804</td> + <td>1.787</td> + </tr> + </tbody> +</table> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="単純ループ">単純ループ</h2> + <pre><code>#! nqp my $count := 100_000_000; @@ -581,70 +643,54 @@ } </code></pre> -<pre><code>#! nqp - -sub fib($n) { - $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +<style type="text/css"> +table , td, th { + border: 2px solid #595959; + border-collapse: collapse; +} +td, th { + padding: 12px; + width: 120px; + height: 40px; } - -my $N := 30; - -my $z := fib($N); - -say("fib($N) = " ~ fib($N)); - -</code></pre> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="フィボナッチの例題">フィボナッチの例題</h2> +th { + background: #f0e6cc; +} +.even { + background: #fbf8f0; +} +.odd { + background: #fefcf9; +} +</style> <ul> - <li>オリジナル - <ul> - <li>1.379 sec</li> - <li>1.350 sec</li> - <li>1.346 sec</li> - </ul> - </li> - <li>CbCMoarVM - <ul> - <li>1.636 sec</li> - <li>1.804 sec</li> - <li>1.787 sec</li> - </ul> - </li> - <li>フィボナッチの例題ではCbCMoarVMが劣る結果となった</li> + <li>単純ループの場合は1.5secほど高速化した</li> + <li>これは実行する命令コードが、 CPUのキャッシュに収まった為であると考えられる</li> </ul> - - -</div> - -<div class='slide'> - <!-- _S9SLIDE_ --> -<h2 id="単純ループ">単純ループ</h2> - -<ul> - <li>オリジナル - <ul> - <li>7.499 sec</li> - <li>7.844 sec</li> - <li>6.746 sec</li> - </ul> - </li> - <li>CbCMoarVM - <ul> - <li>6.135 sec</li> - <li>6.362 sec</li> - <li>6.074 sec</li> - </ul> - </li> - <li>単純ループではCbCMoarVMの方が高速に動作する場合もある</li> -</ul> +<table> + <tbody> + <tr> + <td>[単位 sec]</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td>MoarVM</td> + <td>7.499</td> + <td>7.844</td> + <td>7.822</td> + </tr> + <tr> + <td>CbCMoarVM</td> + <td>6.135</td> + <td>6.362</td> + <td>6.074</td> + </tr> + </tbody> +</table> @@ -688,13 +734,17 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="まとめと今後の課題">まとめと今後の課題</h2> +<h2 id="まとめ">まとめ</h2> <ul> - <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した</li> - <li>CbCの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化する事が出来た</li> + <li>継続と基本としたC言語 Continuation Based Cを用いてPerl6の処理系の一部を書き直した + <ul> + <li>Cの持つCodeGearによって, 本来はモジュール化出来ない箇所をモジュール化が可能となった</li> + <li>CPUキャッシュに収まるループなどの命令の場合は、 通常のMoarVMよりも高速に動作する</li> + </ul> + </li> + <li>今後はCodeGearの特性を活用し、 直接次の命令を実行する処理を実装する</li> </ul> - </div>