Mercurial > hg > Papers > 2011 > nobu-prosym
comparison presen/index.html @ 58:97457764428f
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 26 Dec 2011 07:55:41 +0900 |
parents | ce844f6c504d |
children | 6ef99d3e66b2 |
comparison
equal
deleted
inserted
replaced
57:ce844f6c504d | 58:97457764428f |
---|---|
85 <!-- PAGE --> | 85 <!-- PAGE --> |
86 <div class="slide"> | 86 <div class="slide"> |
87 <h1>目的と背景(1)</h1> | 87 <h1>目的と背景(1)</h1> |
88 <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。</li> | 88 <li>当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。</li> |
89 <li>コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。</li> | 89 <li>コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。</li> |
90 <li class="incremental">コードセグメントにより Many Core での並列実行を高い性能と高い信頼性で実現することができると考える。</li> | 90 <li>Many Core での並列実行を高い性能と高い信頼性で実現することができると考える。</li> |
91 </div> | 91 </div> |
92 <!-- PAGE --> | 92 <!-- PAGE --> |
93 <div class="slide"> | 93 <div class="slide"> |
94 <h1>目的と背景(2)</h1> | 94 <h1>目的と背景(2)</h1> |
95 <li>CbC のコンパイラは2008年に GCC 4.4 をベースとしたコンパイラが開発された。</li> | 95 <li>CbC のコンパイラは2001年に Micro-C 版、2008年には GCC 4.4 をベースとしたコンパイラが開発された。</li> |
96 <li>GCC をベースとした CbC コンパイラは、修正・追加された最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。</li> | 96 <li>GCC をベースとした CbC コンパイラは、修正・追加された最適化の機能を使用する為に、 GCC のアップデートに合わせ変更する必要がある。</li> |
97 <li class="incremental">本研究ではCbC コンパイラを GCC-4.6 へとアップデートを行い、Intel64 への対応するとともに CbC の拡張を行う。 </li> | 97 <li>本研究ではCbC コンパイラを GCC-4.6 へとアップデートを行った。 </li> |
98 </div> | 98 </div> |
99 <!-- PAGE --> | 99 <!-- PAGE --> |
100 <div class="slide"> | 100 <div class="slide"> |
101 <h1>発表内容</h1> | 101 <h1>発表内容</h1> |
102 <ol> | 102 <ol> |
103 <li>CbC の紹介</li> | 103 <li>CbC の紹介</li> |
104 <li>GCC でのコンパイルの流れ</li> | 104 <li>GCC でのコンパイルの流れ</li> |
105 <li>CbC の実装</li> | 105 <font color="red"> |
106 <li>CbC の実装</li> | |
107 </font> | |
106 <!-- | 108 <!-- |
107 <ul> | 109 <ul> |
108 <li>Tail Call Elimination</li> | 110 <li>Tail Call Elimination</li> |
109 <li>goto シンタックスの追加</li> | 111 <li>goto シンタックスの追加</li> |
110 <li>環境付き継続</li> | 112 <li>環境付き継続</li> |
126 <li>コードセグメントの処理は最後に別のコードセグメントへ継続(goto)することで続いていく。</li> | 128 <li>コードセグメントの処理は最後に別のコードセグメントへ継続(goto)することで続いていく。</li> |
127 </ul> | 129 </ul> |
128 </div> | 130 </div> |
129 <!-- PAGE --> | 131 <!-- PAGE --> |
130 <div class="slide"> | 132 <div class="slide"> |
133 <h1>Continuation Based C</h1> | |
134 <h2>継続:現在の処理を実行していく為の情報</h2> | |
135 <!-- | |
136 <li>Cでは関数呼び出しの後、呼び出し元の環境に復帰する必要がある。</li> | |
137 --> | |
138 <li>Cにおいての継続</li> | |
139 <ul> | |
140 <li>続く命令のアドレス</li> | |
141 <li>命令に必要なデータ</li> | |
142 <li>スタックに積まれている値(環境)</li> | |
143 </ul> | |
144 <li>CbC継続(軽量継続)</li> | |
145 <ul> | |
146 <li>続く命令とその命令に必要なデータ</li> | |
147 <li></li> | |
148 </ul> | |
149 </div> | |
150 <!-- PAGE --> | |
151 <div class="slide"> | |
131 <h1>Continuation based C </h1> | 152 <h1>Continuation based C </h1> |
132 <small> | 153 <small> |
133 <table width=100% > | 154 <table width=100% > |
134 <tr> | 155 <tr> |
135 <caption>階乗を求めるCbCのプログラム</caption> | 156 <caption>階乗を求めるCbCのプログラム</caption> |
137 <pre> | 158 <pre> |
138 __code print_factorial(int prod) { | 159 __code print_factorial(int prod) { |
139 printf("factorial = %d\n",prod); | 160 printf("factorial = %d\n",prod); |
140 exit(0); | 161 exit(0); |
141 } | 162 } |
163 | |
142 __code factorial0(int prod, int x) { | 164 __code factorial0(int prod, int x) { |
143 if ( x >= 1) { | 165 if ( x >= 1) { |
144 goto factorial0(prod*x, x-1); | 166 goto factorial0(prod*x, x-1); |
145 }else{ | 167 }else{ |
146 goto print_factorial(prod); | 168 goto print_factorial(prod); |
151 <td> | 173 <td> |
152 <pre> | 174 <pre> |
153 __code factorial(int x) { | 175 __code factorial(int x) { |
154 goto factorial0(1, x); | 176 goto factorial0(1, x); |
155 } | 177 } |
178 | |
156 int main(int argc, char **argv) { | 179 int main(int argc, char **argv) { |
157 int i; | 180 int i; |
158 i = atoi(argv[1]); | 181 i = atoi(argv[1]); |
159 goto factorial(i); | 182 goto factorial(i); |
160 return 0; | 183 return 0; |
172 <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる(軽量継続)。</li> | 195 <li>継続の際にスタックに載せるデータはコードセグメントへの引数だけとなる(軽量継続)。</li> |
173 <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> | 196 <!-- <li>スタックポインタの位置を変えずにすむ。</li> --> |
174 <p style=" margin-right:auto; margin-left:auto;"> | 197 <p style=" margin-right:auto; margin-left:auto;"> |
175 <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> | 198 <img class="scale" src="./pix/cs_stack.png" style="height: 7em;"> |
176 </p> | 199 </p> |
177 <li class="incremental">より高度に最適化されたプログラミングが可能になる。</li> | |
178 </div> | 200 </div> |
179 <!-- PAGE --> | 201 <!-- PAGE --> |
180 <div class="slide"> | 202 <div class="slide"> |
181 <h1>Continuation Based C</h1> | 203 <h1>Continuation Based C</h1> |
182 <li></li> | 204 <li></li> |
237 goto factorial0(1, x); | 259 goto factorial0(1, x); |
238 </pre> | 260 </pre> |
239 </td> | 261 </td> |
240 <td> | 262 <td> |
241 <pre> | 263 <pre> |
242 goto factorial0(1, x); | 264 factorial0(1, x); |
243 return; | 265 return; |
244 </pre> | 266 </pre> |
245 </td> | 267 </td> |
246 </tr> | 268 </tr> |
247 </table> | 269 </table> |
248 </div> | 270 </div> |
249 <!-- PAGE --> | 271 <!-- PAGE --> |
250 <div class="slide"> | 272 <div class="slide"> |
251 <h1>fastcall属性の付与</h1> | 273 <h1>引数渡し</h1> |
274 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li> | |
275 <ul> | |
276 <li>Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていたため。</li> | |
277 </ul> | |
278 <li class="incremental">そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに</li> | |
279 </div> | |
280 <!-- PAGE --> | |
281 <div class="slide"> | |
282 <h1>引数渡し(fastcall属性の付与)</h1> | |
252 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> | 283 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> |
253 <li>コードセグメントは処理が細かい為、継続の回数が多くなる。引数をレジスタ渡しにすることで速度向上を狙う。</li> | 284 <li>__code で宣言された関数は自動でfastcall属性が付与される。</li> |
285 <small> | |
254 <pre> | 286 <pre> |
255 if(!TARGET_64BIT) { | 287 if(!TARGET_64BIT) { |
256 attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); | 288 attrs = build_tree_list (get_identifier("fastcall"), NULL_TREE); |
257 declspecs_add_attrs(specs, attrs); | 289 declspecs_add_attrs(specs, attrs); |
258 } | 290 } |
259 </pre> | 291 </pre> |
260 <li>Intel64 に対してはfastcallは標準でつくようになっている。</li> | 292 </small> |
293 <p><small>Intel64 ではレジスタが増えている為、fastcallは標準でつくようになっている。</small></p> | |
294 </div> | |
295 <!-- PAGE --> | |
296 <div class="slide"> | |
297 <h1></h1> | |
298 <li></li> | |
261 </div> | 299 </div> |
262 <!-- PAGE --> | 300 <!-- PAGE --> |
263 <div class="slide"> | 301 <div class="slide"> |
264 <h1></h1> | 302 <h1></h1> |
265 <li></li> | 303 <li></li> |