Mercurial > hg > Papers > 2012 > nobu-thesis
annotate presen/presentation.html @ 37:cee254f6af59 draft
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 28 Feb 2012 05:23:38 +0900 |
parents | 01238ec569ea |
children | bbebd829c423 |
rev | line source |
---|---|
27 | 1 <!DOCTYPE html> |
2 <!-- | |
3 Copyright 2010 Google Inc. | |
4 | |
5 Licensed under the Apache License, Version 2.0 (the "License"); | |
6 you may not use this file except in compliance with the License. | |
7 You may obtain a copy of the License at | |
8 | |
9 http://www.apache.org/licenses/LICENSE-2.0 | |
10 | |
11 Unless required by applicable law or agreed to in writing, software | |
12 distributed under the License is distributed on an "AS IS" BASIS, | |
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 See the License for the specific language governing permissions and | |
15 limitations under the License. | |
16 | |
17 Original slides: Marcin Wichary (mwichary@google.com) | |
18 Modifications: Ernest Delgado (ernestd@google.com) | |
19 Alex Russell (slightlyoff@chromium.org) | |
20 | |
21 landslide modifications: Adam Zapletal (adamzap@gmail.com) | |
22 Nicolas Perriault (nperriault@gmail.com) | |
23 --> | |
24 <html> | |
25 <head> | |
26 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
27 <meta http-equiv="X-UA-Compatible" content="chrome=1"> | |
28 | 28 <title>Continuation based C の <br> GCC 4.6による実装</title> |
27 | 29 <!-- Styles --> |
30 | |
31 <link rel="stylesheet" media="print" href="file:///Library/Python/2.7/site-packages/landslide-1.0.1-py2.7.egg/landslide/themes/default/css/print.css"> | |
32 <link rel="stylesheet" media="screen, projection" href="file:///Library/Python/2.7/site-packages/landslide-1.0.1-py2.7.egg/landslide/themes/tango/css/screen.css"> | |
33 | |
34 | |
35 | |
36 <link rel="stylesheet" href="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/presen.css"> | |
37 | |
38 | |
39 <!-- /Styles --> | |
40 <!-- Javascripts --> | |
41 | |
42 <script type="text/javascript" src="file:///Library/Python/2.7/site-packages/landslide-1.0.1-py2.7.egg/landslide/themes/default/js/slides.js"></script> | |
43 | |
44 | |
45 <!-- /Javascripts --> | |
46 </head> | |
47 <body> | |
48 <div id="blank"></div> | |
49 <div class="presentation"> | |
50 <div id="current_presenter_notes"> | |
51 <div id="presenter_note"></div> | |
52 </div> | |
53 <div class="slides"> | |
54 | |
55 <!-- slide source: ./cbc.md --> | |
56 <div class="slide-wrapper"> | |
57 <div class="slide"> | |
58 <div class="inner"> | |
59 | |
28 | 60 <header><h1>Continuation based C の <br> GCC 4.6による実装</h1></header> |
27 | 61 |
62 | |
63 </div> | |
64 <div class="presenter_notes"> | |
65 <header><h1>Presenter Notes</h1></header> | |
66 <section> | |
67 | |
68 </section> | |
69 </div> | |
70 <footer> | |
71 | |
72 <aside class="source"> | |
73 Source: <a href="./cbc.md">./cbc.md</a> | |
74 </aside> | |
75 | |
76 <aside class="page_number"> | |
35 | 77 1/22 |
27 | 78 </aside> |
79 </footer> | |
80 </div> | |
81 </div> | |
82 | |
83 <!-- slide source: ./cbc.md --> | |
84 <div class="slide-wrapper"> | |
85 <div class="slide has_notes"> | |
86 <div class="inner"> | |
87 | |
37 | 88 <header><h2>研究目的</h2></header> |
27 | 89 |
90 | |
91 <section><p class="notes">plop</p> | |
37 | 92 <li><font color=red size=5em>状態遷移記述をベースとしたより細かい単位でのプログラミングを実現する</font></li> |
93 | |
27 | 94 <ul> |
37 | 95 <li>組込みソフト、Real-time処理、通信プロトコル記述、どれも状態遷移ベース</li> |
96 <li>現存する記述言語は状態遷移の記述に向いていない</li> | |
97 <li>スタックが状態を隠蔽するため、分割しにくい、検証が難しい</li> | |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
98 <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を提案している。</li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
99 <li>CbC のコンパイラは Micro-C 版 と GCC ベース(以下 CbC-GCC)のコンパイラが開発されている。</li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
100 <li>しかし, CbC-GCC はいくつかのバグがあり機能の修正の余地があった。</li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
101 <li>また、GCC の最新の機能を使用するためにも CbC-GCC は GCC のアップデートに合わせていく必要がある。</li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
102 </ul> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
103 <h2>本研究では CbC-GCC のアップデートを行い、より良いコードを生成する CbC の処理系を開発した。</h2></section> |
27 | 104 |
105 </div> | |
106 <div class="presenter_notes"> | |
107 <header><h1>Presenter Notes</h1></header> | |
108 <section> | |
109 | |
110 </section> | |
111 </div> | |
112 <footer> | |
113 | |
114 <aside class="source"> | |
115 Source: <a href="./cbc.md">./cbc.md</a> | |
116 </aside> | |
117 | |
118 <aside class="page_number"> | |
35 | 119 2/22 |
27 | 120 </aside> |
121 </footer> | |
122 </div> | |
123 </div> | |
124 | |
125 <!-- slide source: ./cbc.md --> | |
126 <div class="slide-wrapper"> | |
127 <div class="slide"> | |
128 <div class="inner"> | |
129 | |
130 <header><h1>Continuation based C</h1></header> | |
131 | |
132 | |
133 <section><h2>コードセグメント単位での記述と継続を基本としたプログラミング言語</h2> | |
134 <li>コーセグメント:CbC におけるプログラムの基本単位</li> | |
135 | |
136 <ul> | |
137 <li>C の関数よりも細かな単位</li> | |
35 | 138 <li>構文は C と同じだが、C から関数コールとループ制御が取り除かれた形</li> |
27 | 139 <li>コードセグメントの末尾処理で別のコードセグメントへ継続(goto)することで CbC のプログラムは続いていく。</li> |
140 </ul> | |
141 | |
37 | 142 <table width=100% border=1> |
143 <tr> | |
144 <td style="margin-left:auto; margin-right: auto; text-align: center; width:50%" > | |
145 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/codesegment.png" style="width:100%"> | |
27 | 146 </td> |
37 | 147 <td> |
148 <pre style="margin-left:5%"> | |
149 __code cs_a(int num) { | |
150 : | |
151 : | |
152 goto cs_b(); | |
153 } | |
154 </pre> | |
155 </td> | |
156 </tr> | |
27 | 157 </table></section> |
158 | |
159 </div> | |
160 <div class="presenter_notes"> | |
161 <header><h1>Presenter Notes</h1></header> | |
162 <section> | |
163 | |
164 </section> | |
165 </div> | |
166 <footer> | |
167 | |
168 <aside class="source"> | |
169 Source: <a href="./cbc.md">./cbc.md</a> | |
170 </aside> | |
171 | |
172 <aside class="page_number"> | |
35 | 173 3/22 |
27 | 174 </aside> |
175 </footer> | |
176 </div> | |
177 </div> | |
178 | |
179 <!-- slide source: ./cbc.md --> | |
180 <div class="slide-wrapper"> | |
181 <div class="slide"> | |
182 <div class="inner"> | |
183 | |
184 <header><h1>Continuation based C</h1></header> | |
185 | |
186 | |
187 <section><h2>継続:現在の処理を実行していく為の情報</h2> | |
188 <p><table width=100% border=1> | |
189 <tr> | |
190 <td><h2>Cの継続</h2></td> | |
191 <td><h2>CbCの継続(軽量継続)</h2></td> | |
192 </tr> | |
193 <tr> | |
194 <td> | |
195 <ul> | |
196 <li>続く命令のアドレス</li> | |
197 <li>命令に必要なデータ</li> | |
198 <li>スタックに積まれている値(環境)</li> | |
199 </ul> | |
200 </td> | |
201 <td> | |
202 <ul> | |
203 <li>Cの継続から環境を除外</li> | |
204 <li>続く命令とその命令に必要なデータのみ</li> | |
205 </ul> | |
206 </td> | |
207 </tr> | |
208 <t> | |
209 <td style="margin-left:auto; margin-right: auto; text-align: center;"> | |
210 <img class="scale" src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/func_call.png" style="height: 18em;"> | |
211 </td> | |
212 <td style="margin-left:auto; margin-right: auto; text-align: center;"> | |
213 <img class="scale" src="./pix/cs_stack.png" style="height: 18em;"> | |
214 </td> | |
215 </tr> | |
216 </table></p></section> | |
217 | |
218 </div> | |
219 <div class="presenter_notes"> | |
220 <header><h1>Presenter Notes</h1></header> | |
221 <section> | |
222 | |
223 </section> | |
224 </div> | |
225 <footer> | |
226 | |
227 <aside class="source"> | |
228 Source: <a href="./cbc.md">./cbc.md</a> | |
229 </aside> | |
230 | |
231 <aside class="page_number"> | |
35 | 232 4/22 |
27 | 233 </aside> |
234 </footer> | |
235 </div> | |
236 </div> | |
237 | |
238 <!-- slide source: ./cbc.md --> | |
239 <div class="slide-wrapper"> | |
240 <div class="slide"> | |
241 <div class="inner"> | |
242 | |
243 <header><h1>Continuation based C</h1></header> | |
244 | |
245 | |
246 <section><p><table width=100% border=1> | |
247 <caption>階乗を求める CbC のプログラム</caption> | |
37 | 248 <td width=50%> |
249 <pre style="margin-left:5%"> | |
250 __code print_factorial(int prod) | |
251 { | |
252 printf("factorial = %d\n",prod); | |
253 exit(0); | |
254 } | |
255 __code factorial0(int prod, int x) | |
256 { | |
257 if ( x >= 1) { | |
258 goto factorial0(prod*x, x-1); | |
259 }else{ | |
260 goto print_factorial(prod); | |
261 } | |
262 } | |
263 __code factorial(int x) | |
264 { | |
265 goto factorial0(1, x); | |
266 } | |
267 int main(int argc, char **argv) | |
268 { | |
269 int i; | |
270 i = atoi(argv[1]); | |
271 goto factorial(i); | |
272 } | |
27 | 273 </pre> |
274 </td> | |
275 <td> | |
276 <li>__code によるコードセグメントの宣言</li> | |
37 | 277 <li>引数付きの goto でコードセグメントを呼び出すことができる</li> |
278 <li>内部では call ではなく jmp 命令でコードセグメントの処理が遷移している</li> | |
27 | 279 </td> |
280 </table></p></section> | |
281 | |
282 </div> | |
283 <div class="presenter_notes"> | |
284 <header><h1>Presenter Notes</h1></header> | |
285 <section> | |
286 | |
287 </section> | |
288 </div> | |
289 <footer> | |
290 | |
291 <aside class="source"> | |
292 Source: <a href="./cbc.md">./cbc.md</a> | |
293 </aside> | |
294 | |
295 <aside class="page_number"> | |
35 | 296 5/22 |
27 | 297 </aside> |
298 </footer> | |
299 </div> | |
300 </div> | |
301 | |
302 <!-- slide source: ./cbc.md --> | |
303 <div class="slide-wrapper"> | |
304 <div class="slide"> | |
305 <div class="inner"> | |
306 | |
35 | 307 <header><h1>Gnu Compiler Collection (GCC)</h1></header> |
308 | |
309 | |
37 | 310 <section><p><li>GCC: オープンソースのコンパイラ群</li> |
35 | 311 <li>ここで扱う GCC はソースコードをアセンブラに変換する『cc1』のことを指す。</li> |
312 <li>GCC がソースコードを読み込みアセンブラ言語を出力するまでの流れは以下の図のようになる。</li> | |
313 <table width=100%> | |
314 <caption>GCC のアセンブラ言語出力までの流れ</caption> | |
315 <td style="margin:auto; text-align:center;"> | |
316 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/ir.png" style="height:15em"> | |
317 </td> | |
318 </table> | |
319 <li>ソースコードはアセンブラに変換される間に 4 つのデータ構造に変換される。</li> | |
320 <li>この中でも CbC の実装では Parser と RTL の生成部分に手が加えられている。</li></p></section> | |
321 | |
322 </div> | |
323 <div class="presenter_notes"> | |
324 <header><h1>Presenter Notes</h1></header> | |
325 <section> | |
326 | |
327 </section> | |
328 </div> | |
329 <footer> | |
330 | |
331 <aside class="source"> | |
332 Source: <a href="./cbc.md">./cbc.md</a> | |
333 </aside> | |
334 | |
335 <aside class="page_number"> | |
336 6/22 | |
337 </aside> | |
338 </footer> | |
339 </div> | |
340 </div> | |
341 | |
342 <!-- slide source: ./cbc.md --> | |
343 <div class="slide-wrapper"> | |
344 <div class="slide"> | |
345 <div class="inner"> | |
346 | |
347 <header><h1>CbC の実装 : 軽量継続</h1></header> | |
27 | 348 |
349 | |
37 | 350 <section><p><li>CbC-GCC の軽量継続は最適化の1つ, <font color=red>Tail Call Elimination(末尾除去)</font>により実装されている.</li></p> |
27 | 351 <h2>Tail Call Elimination</h2> |
352 <p><li>関数呼び出しを call ではなく jmp 命令で行う最適化</li> | |
31 | 353 <li>例えば、以下の場合関数 g は jmp 命令で関数 f へと処理が移る</li></p> |
354 <table width=100% border=1> | |
27 | 355 <tr> |
356 <td width=50%> | |
357 <pre> | |
358 void f(int a, int b) { | |
359 printf("f: a=%d b=%d\n",a,b); | |
360 return ; | |
361 } | |
362 | |
363 void g(int a, int b){ | |
364 printf("g: a=%d b=%d\n",a,b); | |
365 f(a,b); | |
366 return; | |
367 } | |
368 | |
369 int main() { | |
370 g(3,4); | |
371 return 0; | |
37 | 372 }</pre> |
27 | 373 </td> |
374 <td> | |
375 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/continuation.png" style="height:80%;"> | |
376 </td> | |
377 </tr> | |
378 </table></section> | |
379 | |
380 </div> | |
381 <div class="presenter_notes"> | |
382 <header><h1>Presenter Notes</h1></header> | |
383 <section> | |
384 | |
385 </section> | |
386 </div> | |
387 <footer> | |
388 | |
389 <aside class="source"> | |
390 Source: <a href="./cbc.md">./cbc.md</a> | |
391 </aside> | |
392 | |
393 <aside class="page_number"> | |
35 | 394 7/22 |
27 | 395 </aside> |
396 </footer> | |
397 </div> | |
398 </div> | |
399 | |
400 <!-- slide source: ./cbc.md --> | |
401 <div class="slide-wrapper"> | |
402 <div class="slide"> | |
403 <div class="inner"> | |
404 | |
405 <header><h1>CbC の実装: Tail Call Elimination</h1></header> | |
406 | |
407 | |
408 <section><h2>Tail Call Elimination の条件</h2> | |
409 <p><ul> | |
37 | 410 <li>関数を呼び出す側(caller)と呼び出される側(callee)の戻値の型が一致している。</li> |
27 | 411 <li>関数呼び出しがリターン直前に行われている。</li> |
37 | 412 <li>呼び出される関数(callee)の引数に用いられるスタックサイズが呼出元(caller)のそれより少ない。</li> |
27 | 413 <li>引数の並びのコピーに上書きがない。</li> |
414 </ul></p> | |
415 <h2>条件回避の為の実装</h2> | |
416 <p><ul> | |
417 <li>コードセグメントの型はvoid型で統一する。</li> | |
418 <li>gotoの直後に自動で return を置く。</li> | |
419 <li>スタックサイズは固定にする。</li> | |
420 <li>引数は一旦、一時変数にコピーする。</li> | |
421 </ul></p></section> | |
422 | |
423 </div> | |
424 <div class="presenter_notes"> | |
425 <header><h1>Presenter Notes</h1></header> | |
426 <section> | |
427 | |
428 </section> | |
429 </div> | |
430 <footer> | |
431 | |
432 <aside class="source"> | |
433 Source: <a href="./cbc.md">./cbc.md</a> | |
434 </aside> | |
435 | |
436 <aside class="page_number"> | |
35 | 437 8/22 |
27 | 438 </aside> |
439 </footer> | |
440 </div> | |
441 </div> | |
442 | |
443 <!-- slide source: ./cbc.md --> | |
444 <div class="slide-wrapper"> | |
445 <div class="slide"> | |
446 <div class="inner"> | |
447 | |
28 | 448 <header><h1>CbC の実装: Tail Call Elimination</h1></header> |
449 | |
27 | 450 |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
451 <section><h2>Tail Call Elimination の条件をチェックする関数</h2> |
28 | 452 <ul> |
453 <li>今までの実装では Tail Call Elimination の条件をクリアする為に専用の関数を用意していた。</li> | |
454 <li>この専用関数は元々ある GCC コードを元に作成している為, アップデートに合わせて修正していく | |
455 必要があった。</li> | |
35 | 456 </ul> |
37 | 457 <h2>実装の修正とその利点</h2> |
35 | 458 <ul> |
28 | 459 <li>しかし, 今回の実装でその関数を無くし, Tail Call Elimination のフラグを強制的に立たせる実装に変更。</li> |
35 | 460 <li>専用関数がなくなったことで、今後より楽なアップデートを行なっていくことができるようになった。</li> |
37 | 461 <li>また、コードセグメントへの継続が jmp ではなく call 命令で行われるバグがあったが修正できた。</li> |
28 | 462 </ul></section> |
27 | 463 |
464 </div> | |
465 <div class="presenter_notes"> | |
466 <header><h1>Presenter Notes</h1></header> | |
467 <section> | |
468 | |
469 </section> | |
470 </div> | |
471 <footer> | |
472 | |
473 <aside class="source"> | |
474 Source: <a href="./cbc.md">./cbc.md</a> | |
475 </aside> | |
476 | |
477 <aside class="page_number"> | |
35 | 478 9/22 |
27 | 479 </aside> |
480 </footer> | |
481 </div> | |
482 </div> | |
483 | |
484 <!-- slide source: ./cbc.md --> | |
485 <div class="slide-wrapper"> | |
486 <div class="slide"> | |
487 <div class="inner"> | |
488 | |
37 | 489 <header><h1>GCC-4.5, GCC-4.6 の性能比較</h1></header> |
27 | 490 |
491 | |
35 | 492 <section><p><li><font color=red size=5em>本研究では GCC-4.5 から GCC-4.6 へのアップデートを行った。</font></li> |
493 <li>この 2 つのバージョンを用いて生成したプログラムの速度比較を行った。</li> | |
494 <li>conv1: 加算と継続を交互に繰り返すプログラム</li></p> | |
495 <table width=100% border=1> | |
496 <caption>各コンパイラにより生成されたプログラムの速度比較</caption> | |
497 <tr> | |
27 | 498 <td style="margin:auto; text-align:center;"> |
499 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/conv1_for_resume.png" style="height:15em"> | |
500 </td> | |
501 <td> | |
502 <img src="./pix/conv1_mac_for_presen.png" style="height:15em"> | |
503 </td> | |
35 | 504 </tr> |
505 <tr> | |
506 <td style="text-align:center;">x86/Linux</td> | |
507 <td style="text-align:center;">x86/OS X (10.7)</td> | |
508 </tr> | |
27 | 509 </table> |
510 | |
35 | 511 <li>Mac の GCC-4.5 では動かなかった 32bit のプログラムが GCC-4.6 では問題なく動いている。</li> |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
512 |
29 | 513 <li>引数 2、3 の結果はほぼ同じ</li> |
27 | 514 |
31 | 515 <li>引数 1 の結果では 32bit, 64bit 共に GCC-4.6 の方が 1.5倍以上早い</li></section> |
27 | 516 |
517 </div> | |
518 <div class="presenter_notes"> | |
519 <header><h1>Presenter Notes</h1></header> | |
520 <section> | |
521 | |
522 </section> | |
523 </div> | |
524 <footer> | |
525 | |
526 <aside class="source"> | |
527 Source: <a href="./cbc.md">./cbc.md</a> | |
528 </aside> | |
529 | |
530 <aside class="page_number"> | |
35 | 531 10/22 |
27 | 532 </aside> |
533 </footer> | |
534 </div> | |
535 </div> | |
536 | |
537 <!-- slide source: ./cbc.md --> | |
538 <div class="slide-wrapper"> | |
539 <div class="slide"> | |
540 <div class="inner"> | |
541 | |
35 | 542 <header><h1>GCC-4.6 の最適化</h1></header> |
27 | 543 |
544 | |
35 | 545 <section><ul> |
546 <li>GCC-4.6 では最適化の 1つ『インライン展開』が強化されている。</li> | |
547 </ul> | |
548 <h2>インライン展開</h2> | |
549 <ul> | |
550 <li>関数の処理をそのまま関数呼び出し部に展開することで call を省略できる最適化</li> | |
551 </ul> | |
552 <table width=100% border=1> | |
553 <caption><h3>インライン展開の例</h3></caption> | |
554 <tr> | |
555 <td width=50%> | |
37 | 556 <pre style="margin-left:5%"> |
35 | 557 void func(){ |
558 A; | |
559 B; | |
560 } | |
561 | |
562 int main() { | |
563 func(); | |
564 func(); | |
565 } | |
566 </pre> | |
567 </td> | |
568 <td> | |
37 | 569 <pre style="margin-left:5%"> |
35 | 570 int main() { |
571 A; | |
572 B; | |
573 A; | |
574 B; | |
575 } | |
576 </pre> | |
577 </td> | |
578 </tr> | |
579 </table> | |
580 <li>func の呼び出しがなくなっている。</li></section> | |
27 | 581 |
582 </div> | |
583 <div class="presenter_notes"> | |
584 <header><h1>Presenter Notes</h1></header> | |
585 <section> | |
586 | |
587 </section> | |
588 </div> | |
589 <footer> | |
590 | |
591 <aside class="source"> | |
592 Source: <a href="./cbc.md">./cbc.md</a> | |
593 </aside> | |
594 | |
595 <aside class="page_number"> | |
35 | 596 11/22 |
27 | 597 </aside> |
598 </footer> | |
599 </div> | |
600 </div> | |
601 | |
602 <!-- slide source: ./cbc.md --> | |
603 <div class="slide-wrapper"> | |
604 <div class="slide"> | |
605 <div class="inner"> | |
606 | |
35 | 607 <header><h1>最適化の比較</h1></header> |
29 | 608 |
609 | |
35 | 610 <section><table width=100% border=1> |
611 <caption><h3>それぞれの最適化にかかった conv1プログラムの挙動(引数 1)</h3></caption> | |
612 <tr> | |
613 <td width=30%>最適化なし</td> | |
614 <td width=30%>GCC-4.5の最適化(-O2)</td> | |
615 <td width=30%>GCC-4.6の最適化(-O2)</td> | |
616 </tr> | |
617 <tr> | |
618 <td style="margin:auto; text-align:center;"> | |
619 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/state_conv1_noopt.png" style="width:65%;"> | |
620 </td> | |
621 <td style="margin:auto; text-align:center;"> | |
622 <img src="./pix/state_conv1_45.png" style="width:65%;"> | |
623 </td> | |
624 <td style="margin:auto; text-align:center;"> | |
625 <img src="./pix/state_conv1_46.png" style="width:65%;"> | |
626 </td> | |
627 </tr> | |
628 </table> | |
629 | |
630 <ul> | |
631 <li>最適化無しに比べると GCC-4.5、 GGC-4.6 共にコードセグメントの数が減っている。</li> | |
632 <li>GCC-4.5 でもインライン展開はされているが、GCC-4.6 はより良い最適化がかけられている。</li> | |
30 | 633 </ul></section> |
29 | 634 |
635 </div> | |
636 <div class="presenter_notes"> | |
637 <header><h1>Presenter Notes</h1></header> | |
638 <section> | |
639 | |
640 </section> | |
641 </div> | |
642 <footer> | |
643 | |
644 <aside class="source"> | |
645 Source: <a href="./cbc.md">./cbc.md</a> | |
646 </aside> | |
647 | |
648 <aside class="page_number"> | |
35 | 649 12/22 |
30 | 650 </aside> |
651 </footer> | |
652 </div> | |
653 </div> | |
654 | |
655 <!-- slide source: ./cbc.md --> | |
656 <div class="slide-wrapper"> | |
657 <div class="slide"> | |
658 <div class="inner"> | |
659 | |
35 | 660 <header><h1>最新版のアップデートに合わせる有用性</h1></header> |
30 | 661 |
662 | |
663 <section><ul> | |
35 | 664 <li>今回の『インライン展開』のように GCC の最適化は日々改良されている。</li> |
30 | 665 <li>また、既存の最適化の改良だけでなく新たな最適化の追加等も行われていく。</li> |
666 <li>それらの恩恵を受ける為にも GCC のアップデートに合わせていく事は今後も重要である。</li> | |
667 </ul></section> | |
668 | |
669 </div> | |
670 <div class="presenter_notes"> | |
671 <header><h1>Presenter Notes</h1></header> | |
672 <section> | |
673 | |
674 </section> | |
675 </div> | |
676 <footer> | |
677 | |
678 <aside class="source"> | |
679 Source: <a href="./cbc.md">./cbc.md</a> | |
680 </aside> | |
681 | |
682 <aside class="page_number"> | |
35 | 683 13/22 |
29 | 684 </aside> |
685 </footer> | |
686 </div> | |
687 </div> | |
688 | |
689 <!-- slide source: ./cbc.md --> | |
690 <div class="slide-wrapper"> | |
691 <div class="slide"> | |
692 <div class="inner"> | |
693 | |
694 <header><h1>まとめ</h1></header> | |
695 | |
696 | |
697 <section><ul> | |
30 | 698 <li>今回 CbC-GCC を GCC-4.6 へとアップデートを行った。</li> |
35 | 699 <li>アップデートにより、よりよいコードを生成する CbC のコンパイラを用意することができた。</li> |
37 | 700 <li>また、最適化の強制付与やといった実装の修正も行えた。</li> |
35 | 701 <li>細かな実装を除けば, CbC-GCC は今後 GCC のアップデートに合わせていくだけとなる。</li> |
29 | 702 </ul> |
703 <h2>今後の課題</h2> | |
704 <ul> | |
705 <li>LLVM ベースの CbC コンパイラの開発</li> | |
706 <li>google Go 言語への実装の検討</li> | |
707 </ul></section> | |
708 | |
709 </div> | |
710 <div class="presenter_notes"> | |
711 <header><h1>Presenter Notes</h1></header> | |
712 <section> | |
713 | |
714 </section> | |
715 </div> | |
716 <footer> | |
717 | |
718 <aside class="source"> | |
719 Source: <a href="./cbc.md">./cbc.md</a> | |
720 </aside> | |
721 | |
722 <aside class="page_number"> | |
35 | 723 14/22 |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
724 </aside> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
725 </footer> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
726 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
727 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
728 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
729 <!-- slide source: ./cbc.md --> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
730 <div class="slide-wrapper"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
731 <div class="slide"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
732 <div class="inner"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
733 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
734 <header><h1>jmp と call</h1></header> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
735 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
736 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
737 <section><p><table width=100%> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
738 <caption>インライン展開無しの conv1 プログラム実行結果</caption> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
739 <td style="text-align:center;"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
740 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/fno_inline.png"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
741 </td> |
37 | 742 </table></p></section> |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
743 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
744 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
745 <div class="presenter_notes"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
746 <header><h1>Presenter Notes</h1></header> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
747 <section> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
748 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
749 </section> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
750 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
751 <footer> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
752 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
753 <aside class="source"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
754 Source: <a href="./cbc.md">./cbc.md</a> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
755 </aside> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
756 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
757 <aside class="page_number"> |
35 | 758 15/22 |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
759 </aside> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
760 </footer> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
761 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
762 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
763 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
764 <!-- slide source: ./cbc.md --> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
765 <div class="slide-wrapper"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
766 <div class="slide"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
767 <div class="inner"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
768 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
769 <header><h1>構文の追加</h1></header> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
770 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
771 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
772 <section><h2>リカーシブタイプの宣言に使う"__rectype"</h2> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
773 <ul> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
774 <li>関数宣言時、以下のように引数に自分自身を指す型を入れたい。 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
775 <pre> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
776 __code func(int, func*); |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
777 <pre></li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
778 <li>上記の宣言ではエラーがでる。その為、以下のような宣言になる。 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
779 <pre> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
780 __code func(int, __code (*)()); |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
781 </pre></li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
782 <li>しかし、これでは正しい情報をコンパイラに渡せていない。関数ポインタの引数に型情報が入っていないからである。 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
783 <pre> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
784 __code func(int, __code (<em>)(int, __code(</em>)(int, __code(*)(int, ...)))) |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
785 </pre></li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
786 <li>だが、正しい情報を渡そうとすると上記のように再帰してしまい、宣言できない。</li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
787 <li>そこで __rectype という構文を追加して宣言中の関数自身を指すようにした。 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
788 <pre> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
789 __code func(int, rectype*); |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
790 </pre></li> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
791 </ul></section> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
792 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
793 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
794 <div class="presenter_notes"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
795 <header><h1>Presenter Notes</h1></header> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
796 <section> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
797 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
798 </section> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
799 </div> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
800 <footer> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
801 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
802 <aside class="source"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
803 Source: <a href="./cbc.md">./cbc.md</a> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
804 </aside> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
805 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
806 <aside class="page_number"> |
35 | 807 16/22 |
30 | 808 </aside> |
809 </footer> | |
810 </div> | |
811 </div> | |
812 | |
813 <!-- slide source: ./cbc.md --> | |
814 <div class="slide-wrapper"> | |
815 <div class="slide"> | |
816 <div class="inner"> | |
817 | |
818 <header><h1>conv1 プログラム</h1></header> | |
819 | |
820 | |
821 <section><ul> | |
822 <li>conv1 プログラムでは計算と継続を交互に繰り返し行なう。</li> | |
823 <li> | |
824 <p>しかし状態のいくつかへは関数ポインタとして保存させておき継続を行う。 | |
825 <pre> | |
826 __code g(int i,stack sp) { // Caller | |
827 struct f_g0_interface <em>c = | |
32 | 828 (struct f_g0_interface </em>)(sp -= sizeof(struct f_g0_interface)); |
829 c->ret = g_h1; | |
830 c->i_ = i; | |
831 goto h(i+3,sp); | |
832 } | |
833 __code h(int i,stack sp) { | |
30 | 834 struct f_g0_interface <em>c = (struct f_g0_interface </em>)sp; |
835 goto (c->ret)(i+4,sp); | |
836 } | |
837 </pre></p> | |
32 | 838 </li> |
839 <li> | |
840 <p>関数ポインタへの継続はインライン展開されない。</p> | |
841 </li> | |
30 | 842 </ul></section> |
843 | |
844 </div> | |
845 <div class="presenter_notes"> | |
846 <header><h1>Presenter Notes</h1></header> | |
847 <section> | |
848 | |
849 </section> | |
850 </div> | |
851 <footer> | |
852 | |
853 <aside class="source"> | |
854 Source: <a href="./cbc.md">./cbc.md</a> | |
855 </aside> | |
856 | |
857 <aside class="page_number"> | |
35 | 858 17/22 |
29 | 859 </aside> |
860 </footer> | |
861 </div> | |
862 </div> | |
863 | |
864 <!-- slide source: ./cbc.md --> | |
865 <div class="slide-wrapper"> | |
866 <div class="slide"> | |
867 <div class="inner"> | |
868 | |
869 <header><h1>CbC の実装: 環境付き継続</h1></header> | |
870 | |
871 | |
872 <section><ul> | |
873 <li>環境付き継続: C との互換を取るための機能。継続を行った C の関数に戻ることができる。 </li> | |
874 <li>_CbC_return、 _CbC_environment キーワードを使うことで使える。</li> | |
875 <li> | |
876 <p>以下の使い方の場合、戻値 1 を返す。 | |
877 <pre> | |
878 <strong>code c1(</strong>code ret(int,void <em>),void </em>env) { | |
879 goto ret(1,env); | |
880 } | |
881 int main() { | |
882 goto c1(<strong>return, </strong>environment); | |
883 } | |
884 </pre></p> | |
885 </li> | |
886 <li> | |
887 <p>今回この環境付き継続をスレッドセーフの実装へと修正した。</p> | |
888 </li> | |
889 </ul></section> | |
890 | |
891 </div> | |
892 <div class="presenter_notes"> | |
893 <header><h1>Presenter Notes</h1></header> | |
894 <section> | |
895 | |
896 </section> | |
897 </div> | |
898 <footer> | |
899 | |
900 <aside class="source"> | |
901 Source: <a href="./cbc.md">./cbc.md</a> | |
902 </aside> | |
903 | |
904 <aside class="page_number"> | |
35 | 905 18/22 |
29 | 906 </aside> |
907 </footer> | |
908 </div> | |
909 </div> | |
910 | |
911 <!-- slide source: ./cbc.md --> | |
912 <div class="slide-wrapper"> | |
913 <div class="slide"> | |
914 <div class="inner"> | |
915 | |
916 <header><h1>CbC 引数渡し</h1></header> | |
917 | |
918 | |
919 <section><p><li>CbC では引数渡しにできるだけレジスタを用いるようにしている.</li> | |
920 <table border=1 width=100%> | |
921 <caption><small>fastcall属性有・無の実行速度</small></caption> | |
922 <tr> | |
923 <td width=50% style="text-align:center;">fastcall無し</td> | |
924 </tr> | |
925 <tr> | |
926 <td style="margin:auto; text-align:center;"> | |
927 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/linux_conv_nofastcall.png" style="height:15em;"> | |
928 </td> | |
929 </tr> | |
930 <tr> | |
931 <td width=50% style="text-align:center;">fastcall有り</td> | |
932 <tr> | |
933 <td> | |
934 <img src="./pix/linux_conv_fastcall.png" style="height:15em;"> | |
935 </td> | |
936 </tr> | |
937 </table></p></section> | |
938 | |
939 </div> | |
940 <div class="presenter_notes"> | |
941 <header><h1>Presenter Notes</h1></header> | |
942 <section> | |
943 | |
944 </section> | |
945 </div> | |
946 <footer> | |
947 | |
948 <aside class="source"> | |
949 Source: <a href="./cbc.md">./cbc.md</a> | |
950 </aside> | |
951 | |
952 <aside class="page_number"> | |
35 | 953 19/22 |
32 | 954 </aside> |
955 </footer> | |
956 </div> | |
957 </div> | |
958 | |
959 <!-- slide source: ./cbc.md --> | |
960 <div class="slide-wrapper"> | |
961 <div class="slide"> | |
962 <div class="inner"> | |
963 | |
964 <header><h1>引数の並びに上書きコピー</h1></header> | |
965 | |
966 | |
967 <section><p><li>以下の呼び出しを行うと、スタックの書き換えがおこる</li> | |
968 <pre> | |
969 void funcA(int a, int b) { | |
970 funcB(b, a); | |
971 } | |
972 </pre></p> | |
973 <table width=100%> | |
974 <tr> | |
975 <td style="margin:auto; text-align:center;"> | |
976 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/cs_prog.png"> | |
977 </td> | |
978 </tr> | |
979 </table></section> | |
980 | |
981 </div> | |
982 <div class="presenter_notes"> | |
983 <header><h1>Presenter Notes</h1></header> | |
984 <section> | |
985 | |
986 </section> | |
987 </div> | |
988 <footer> | |
989 | |
990 <aside class="source"> | |
991 Source: <a href="./cbc.md">./cbc.md</a> | |
992 </aside> | |
993 | |
994 <aside class="page_number"> | |
35 | 995 20/22 |
996 </aside> | |
997 </footer> | |
998 </div> | |
999 </div> | |
1000 | |
1001 <!-- slide source: ./cbc.md --> | |
1002 <div class="slide-wrapper"> | |
1003 <div class="slide"> | |
1004 <div class="inner"> | |
1005 | |
1006 <header><h1>最適化の比較</h1></header> | |
1007 | |
1008 | |
1009 <section><table width=100% border=1> | |
1010 <caption>各コンパイラにより生成されたコードの速度比較</caption> | |
1011 <tr> | |
1012 <td style="margin:auto; text-align:center;"> | |
1013 <img src="file:///Users/aotokage/hg/Papers/2012/nobu-thesis/presen/./pix/O3_conv1_linux.png" style="height:15em"> | |
1014 </td> | |
1015 <td> | |
1016 <img src="./pix/O3_conv1_mac.png" style="height:15em"> | |
1017 </td> | |
1018 </tr> | |
1019 <tr> | |
1020 <td style="text-align:center;">x86/Linux</td> | |
1021 <td style="text-align:center;">x86/OS X (10.7)</td> | |
1022 </tr> | |
1023 </table></section> | |
1024 | |
1025 </div> | |
1026 <div class="presenter_notes"> | |
1027 <header><h1>Presenter Notes</h1></header> | |
1028 <section> | |
1029 | |
1030 </section> | |
1031 </div> | |
1032 <footer> | |
1033 | |
1034 <aside class="source"> | |
1035 Source: <a href="./cbc.md">./cbc.md</a> | |
1036 </aside> | |
1037 | |
1038 <aside class="page_number"> | |
1039 21/22 | |
29 | 1040 </aside> |
1041 </footer> | |
1042 </div> | |
1043 </div> | |
1044 | |
1045 <!-- slide source: ./cbc.md --> | |
1046 <div class="slide-wrapper"> | |
1047 <div class="slide"> | |
1048 <div class="inner"> | |
1049 | |
27 | 1050 <header><h1>最適化の比較</h1></header> |
1051 | |
1052 | |
32 | 1053 <section><table width=100% border=1> |
27 | 1054 <caption>それぞれの最適化により吐かれたアセンブラコード</caption> |
1055 <tr> | |
1056 <td width=50% style="text-align:center;">CbC-GCC-4.5</td> | |
1057 <td width=50% style="text-align:center;">CbC-GCC-4.6</td> | |
32 | 1058 </tr> |
1059 | |
1060 <tr> | |
27 | 1061 <td> |
1062 <pre> | |
1063 main: | |
1064 call f | |
1065 : | |
1066 jmp f_g0 | |
1067 : | |
1068 movq $f_g1, -24(%rdx) | |
1069 addl $10, %edi | |
1070 movq $g_h1, -48(%rdx) | |
1071 jmp g_h1 | |
1072 : | |
1073 movq 24(%rsi), %rdx | |
1074 movq %rax, %rsi | |
1075 : | |
32 | 1076 jmp *%rdx |
27 | 1077 : |
1078 movq 24(%rsi), %rdx | |
1079 : | |
32 | 1080 jmp *%rdx |
27 | 1081 </pre> |
1082 </td> | |
1083 <td> | |
1084 <pre> | |
1085 main: | |
1086 movq $f_g1, main_stack+2000(%rip) | |
1087 : | |
1088 call g_h1 | |
1089 : | |
1090 movq 24(%rax), %rdx | |
1091 : | |
32 | 1092 jmp *%rdx |
27 | 1093 : |
1094 movq 24(%rax), %rdx | |
1095 : | |
32 | 1096 jmp *%rdx |
27 | 1097 </pre> |
1098 </td> | |
1099 </tr> | |
1100 <!-- | |
1101 <tr> | |
32 | 1102 <td></td> |
1103 <td></td> | |
1104 </tr> | |
1105 --> | |
1106 | |
1107 </table> | |
27 | 1108 <li>関数を展開してその場で計算する『インライン展開』がより強力になっているのが確認できる</li> |
1109 <!-- | |
1110 <li>保存していた関数ポインタへの継続はインライン展開は行われない</li> | |
32 | 1111 --> |
1112 | |
1113 ---</section> | |
27 | 1114 |
1115 </div> | |
1116 <div class="presenter_notes"> | |
1117 <header><h1>Presenter Notes</h1></header> | |
1118 <section> | |
1119 | |
1120 </section> | |
1121 </div> | |
1122 <footer> | |
1123 | |
1124 <aside class="source"> | |
1125 Source: <a href="./cbc.md">./cbc.md</a> | |
1126 </aside> | |
1127 | |
1128 <aside class="page_number"> | |
35 | 1129 22/22 |
27 | 1130 </aside> |
1131 </footer> | |
1132 </div> | |
1133 </div> | |
1134 | |
1135 </div> | |
1136 </div> | |
1137 | |
1138 <div id="toc" class="sidebar hidden"> | |
1139 <h2>Table of Contents</h2> | |
1140 <table> | |
1141 <caption>Table of Contents</caption> | |
1142 | |
1143 <tr id="toc-row-1"> | |
28 | 1144 <th><a href="#slide1">Continuation based C の <br> GCC 4.6による実装</a></th> |
27 | 1145 <td><a href="#slide1">1</a></td> |
1146 </tr> | |
1147 | |
1148 | |
1149 <tr id="toc-row-2" class="sub"> | |
37 | 1150 <th><a href="#slide2">研究目的</a></th> |
27 | 1151 <td><a href="#slide2">2</a></td> |
1152 </tr> | |
1153 | |
1154 | |
1155 | |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1156 <tr id="toc-row-3"> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1157 <th><a href="#slide3">Continuation based C</a></th> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1158 <td><a href="#slide3">3</a></td> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1159 </tr> |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1160 |
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1161 |
27 | 1162 <tr id="toc-row-4"> |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1163 <th><a href="#slide4">Continuation based C</a></th> |
27 | 1164 <td><a href="#slide4">4</a></td> |
1165 </tr> | |
1166 | |
1167 | |
1168 <tr id="toc-row-5"> | |
1169 <th><a href="#slide5">Continuation based C</a></th> | |
1170 <td><a href="#slide5">5</a></td> | |
1171 </tr> | |
1172 | |
1173 | |
1174 <tr id="toc-row-6"> | |
35 | 1175 <th><a href="#slide6">Gnu Compiler Collection (GCC)</a></th> |
27 | 1176 <td><a href="#slide6">6</a></td> |
1177 </tr> | |
1178 | |
1179 | |
1180 <tr id="toc-row-7"> | |
35 | 1181 <th><a href="#slide7">CbC の実装 : 軽量継続</a></th> |
27 | 1182 <td><a href="#slide7">7</a></td> |
1183 </tr> | |
1184 | |
1185 | |
1186 <tr id="toc-row-8"> | |
34
3922a95e99a8
commit presen
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
32
diff
changeset
|
1187 <th><a href="#slide8">CbC の実装: Tail Call Elimination</a></th> |
27 | 1188 <td><a href="#slide8">8</a></td> |
1189 </tr> | |
1190 | |
1191 | |
1192 <tr id="toc-row-9"> | |
35 | 1193 <th><a href="#slide9">CbC の実装: Tail Call Elimination</a></th> |
27 | 1194 <td><a href="#slide9">9</a></td> |
1195 </tr> | |
1196 | |
1197 | |
1198 <tr id="toc-row-10"> | |
37 | 1199 <th><a href="#slide10">GCC-4.5, GCC-4.6 の性能比較</a></th> |
27 | 1200 <td><a href="#slide10">10</a></td> |
1201 </tr> | |
1202 | |
1203 | |
1204 <tr id="toc-row-11"> | |
35 | 1205 <th><a href="#slide11">GCC-4.6 の最適化</a></th> |
27 | 1206 <td><a href="#slide11">11</a></td> |
1207 </tr> | |
1208 | |
1209 | |
1210 <tr id="toc-row-12"> | |
35 | 1211 <th><a href="#slide12">最適化の比較</a></th> |
27 | 1212 <td><a href="#slide12">12</a></td> |
1213 </tr> | |
1214 | |
1215 | |
1216 <tr id="toc-row-13"> | |
35 | 1217 <th><a href="#slide13">最新版のアップデートに合わせる有用性</a></th> |
27 | 1218 <td><a href="#slide13">13</a></td> |
1219 </tr> | |
1220 | |
1221 | |
1222 <tr id="toc-row-14"> | |
35 | 1223 <th><a href="#slide14">まとめ</a></th> |
27 | 1224 <td><a href="#slide14">14</a></td> |
1225 </tr> | |
1226 | |
1227 | |
1228 <tr id="toc-row-15"> | |
35 | 1229 <th><a href="#slide15">jmp と call</a></th> |
27 | 1230 <td><a href="#slide15">15</a></td> |
1231 </tr> | |
1232 | |
1233 | |
1234 <tr id="toc-row-16"> | |
35 | 1235 <th><a href="#slide16">構文の追加</a></th> |
27 | 1236 <td><a href="#slide16">16</a></td> |
1237 </tr> | |
1238 | |
1239 | |
1240 <tr id="toc-row-17"> | |
35 | 1241 <th><a href="#slide17">conv1 プログラム</a></th> |
27 | 1242 <td><a href="#slide17">17</a></td> |
1243 </tr> | |
1244 | |
1245 | |
1246 <tr id="toc-row-18"> | |
35 | 1247 <th><a href="#slide18">CbC の実装: 環境付き継続</a></th> |
27 | 1248 <td><a href="#slide18">18</a></td> |
1249 </tr> | |
1250 | |
1251 | |
28 | 1252 <tr id="toc-row-19"> |
35 | 1253 <th><a href="#slide19">CbC 引数渡し</a></th> |
28 | 1254 <td><a href="#slide19">19</a></td> |
1255 </tr> | |
1256 | |
1257 | |
30 | 1258 <tr id="toc-row-20"> |
32 | 1259 <th><a href="#slide20">引数の並びに上書きコピー</a></th> |
30 | 1260 <td><a href="#slide20">20</a></td> |
1261 </tr> | |
1262 | |
1263 | |
1264 <tr id="toc-row-21"> | |
1265 <th><a href="#slide21">最適化の比較</a></th> | |
1266 <td><a href="#slide21">21</a></td> | |
1267 </tr> | |
1268 | |
1269 | |
35 | 1270 <tr id="toc-row-22"> |
1271 <th><a href="#slide22">最適化の比較</a></th> | |
1272 <td><a href="#slide22">22</a></td> | |
1273 </tr> | |
1274 | |
1275 | |
27 | 1276 </table> |
1277 </div> | |
1278 | |
1279 <div id="help" class="sidebar hidden"> | |
1280 <h2>Help</h2> | |
1281 <table> | |
1282 <caption>Help</caption> | |
1283 <tr> | |
1284 <th>Table of Contents</th> | |
1285 <td>t</td> | |
1286 </tr> | |
1287 <tr> | |
1288 <th>Exposé</th> | |
1289 <td>ESC</td> | |
1290 </tr> | |
1291 <tr> | |
1292 <th>Full screen slides</th> | |
1293 <td>e</td> | |
1294 </tr> | |
1295 <tr> | |
1296 <th>Presenter View</th> | |
1297 <td>p</td> | |
1298 </tr> | |
1299 <tr> | |
1300 <th>Source Files</th> | |
1301 <td>s</td> | |
1302 </tr> | |
1303 <tr> | |
1304 <th>Slide Numbers</th> | |
1305 <td>n</td> | |
1306 </tr> | |
1307 <tr> | |
1308 <th>Toggle screen blanking</th> | |
1309 <td>b</td> | |
1310 </tr> | |
1311 <tr> | |
1312 <th>Show/hide slide context</th> | |
1313 <td>c</td> | |
1314 </tr> | |
1315 <tr> | |
1316 <th>Notes</th> | |
1317 <td>2</td> | |
1318 </tr> | |
1319 <tr> | |
1320 <th>Help</th> | |
1321 <td>h</td> | |
1322 </tr> | |
1323 </table> | |
1324 </div> | |
1325 <script>main()</script> | |
1326 </body> | |
1327 </html> |