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 &lt; 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 &lt; 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の特性を活用し、 直接次の命令を実行する処理を実装する
Binary file presen/slide.pdf has changed
--- 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 &lt; 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 &lt; 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>