58
|
1 <!DOCTYPE html>
|
|
2 <html>
|
|
3 <head>
|
|
4 <meta charset='utf-8'>
|
|
5 <title>Seminar</title>
|
|
6
|
|
7 <!--
|
|
8 Notes on CSS media types used:
|
|
9
|
|
10 1) projection -> slideshow mode (display one slide at-a-time; hide all others)
|
|
11 2) screen -> outline mode (display all slides-at-once on screen)
|
|
12 3) print -> print (and print preview)
|
|
13
|
|
14 Note: toggle between projection/screen (that is, slideshow/outline) mode using t-key
|
|
15
|
|
16 Questions, comments?
|
|
17 - send them along to the mailinglist/forum online @ http://groups.google.com/group/webslideshow
|
|
18 -->
|
|
19
|
|
20 <!-- style sheet links -->
|
|
21 <link rel="stylesheet/less" href="themes/blank/projection.css.less" media="screen,projection">
|
|
22 <link rel="stylesheet/less" href="themes/blank/screen.css.less" media="screen">
|
|
23 <link rel="stylesheet/less" href="themes/blank/print.css.less" media="print">
|
|
24
|
|
25 <link rel="stylesheet/less" href="blank.css.less" media="screen,projection">
|
|
26
|
|
27 <!-- Notes about less css support
|
|
28 - all less stylesheets (*.css.less) need to get listed/loaded first (before the less.js script)
|
|
29 - find more info about less.js online @ http://lesscss.org
|
|
30
|
|
31 ***** NOTE:
|
|
32 less.js browser script currently won’t work if you’re using Google Chrome
|
|
33 and the path to your page starts with "file:///" due to a known Chrome issue.
|
|
34 (In the developer/js console you will see:
|
|
35 XMLHttpRequest cannot load file:///../s6/shared/projection.css.less.
|
|
36 Cross origin requests are only supported for HTTP.)
|
|
37 -->
|
|
38
|
|
39 <!-- add js libs (less, jquery) -->
|
|
40 <script src="js/less-1.1.4.min.js"></script>
|
|
41 <script src="js/jquery-1.7.min.js"></script>
|
|
42
|
|
43 <!-- S6 JS -->
|
|
44 <script src="js/jquery.slideshow.js"></script>
|
|
45 <script src="js/jquery.slideshow.counter.js"></script>
|
|
46 <script src="js/jquery.slideshow.controls.js"></script>
|
|
47 <script src="js/jquery.slideshow.footer.js"></script>
|
|
48 <script src="js/jquery.slideshow.autoplay.js"></script>
|
|
49 <script>
|
|
50 $(document).ready( function() {
|
|
51 Slideshow.init();
|
|
52
|
|
53 // Example 2: Start Off in Outline Mode
|
|
54 // Slideshow.init( { mode: 'outline' } );
|
|
55
|
|
56 // Example 3: Use Custom Transition
|
|
57 // Slideshow.transition = transitionScrollUp;
|
|
58 // Slideshow.init();
|
|
59
|
|
60 // Example 4: Start Off in Autoplay Mode with Custom Transition
|
|
61 // Slideshow.transition = transitionScrollUp;
|
|
62 // Slideshow.init( { mode: 'autoplay' } );
|
|
63 } );
|
|
64 </script>
|
|
65
|
|
66 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
|
|
67 <!--[if IE]>
|
|
68 <script src="js/jquery.microsoft.js"></script>
|
|
69 <![endif]-->
|
|
70
|
|
71 </head>
|
|
72 <body>
|
|
73
|
|
74 <div class="layout">
|
|
75 <div id="header"></div>
|
|
76 <div id="footer">
|
|
77 <div align="right">
|
|
78 <img src="images/concurrency.png" width="200">
|
|
79 </div>
|
|
80 </div>
|
|
81 </div>
|
|
82
|
|
83 <div class="presentation">
|
|
84
|
|
85 <!-- add slides here; example -->
|
|
86
|
|
87 <div class='slide cover'>
|
|
88 <table width="90%" height="90%" border="0" align="center">
|
|
89 <tr>
|
|
90 <td><div align="center">
|
|
91 <h1><font color="#808db5">マルチプラットフォーム対応<br>並列プログラミングフレームワーク</font></h1>
|
|
92 </div></td>
|
|
93 </tr>
|
|
94 <tr>
|
|
95 <td><div align="left">
|
|
96 Yuhi TOMARI
|
|
97 <script>
|
|
98 var date = new Date();
|
|
99 var year = date.getFullYear();
|
|
100 var month = date.getMonth();
|
|
101 var day = date.getDate();
|
|
102
|
|
103 var monthList = new Array("January","February","March","April","May","June",
|
|
104 "July","August","September","October","November","December");
|
|
105
|
|
106 document.write(monthList[month]+" "+day+", "+year);
|
|
107
|
|
108 </script>
|
|
109 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:300%;height:0.2em;">
|
|
110 </div></td>
|
|
111 </tr>
|
|
112 </table>
|
|
113 </div>
|
|
114
|
|
115 <div class='slide'>
|
61
|
116 <h2>マルチプラットフォームなフレームワークにおける並列プログラミング 1/2</h2>
|
58
|
117 <p>プログラムが PC に要求する処理性能は上がってきているが、
|
|
118 消費電力や発熱、クロックの限界といった問題から CPU の性能を上げることによる処理性能の向上は難しい。</p>
|
|
119 <p>プロセッサメーカーはマルチコア CPU や、GPU を含んだヘテロジニアス構成の路線を打ち出している。
|
|
120 クロックの性能を上げるのではなく、コア数を増やす事でパフォーマンスを向上させている。
|
|
121 </p>
|
|
122 <p>
|
|
123 マルチコア CPU や GPU といった<font color="red">マルチコアプラットフォーム</font>なアーキテクチャ上で
|
|
124 リソースを有効活用するには、それぞれのプラットフォームに最適な形でプログラムを並列に動作させる必要がある。
|
|
125 ここでいう最適な形とは、実行の順番やどのリソース上で Task を実行するかといった、
|
|
126 Scheduling を含めたチューニングのことである。
|
|
127 </p>
|
|
128 <p>しかしこれらのチューニングは複雑で、コーディング時に毎回行うと複雑さや拡張性の問題がある。</p>
|
|
129 </div>
|
|
130
|
|
131
|
|
132 <div class='slide'>
|
61
|
133 <h2>マルチプラットフォームなフレームワークにおける並列プログラミング 2/2</h2>
|
58
|
134 <p>
|
|
135 そういった問題を解決するため、本研究では並列プログラミングフレームワーク、 Cerium の開発を行った。
|
|
136 異なるプラットフォーム上で最適なチューニングを行うため、以下の実装を行った。
|
|
137 </p>
|
|
138 <ul>
|
|
139 <li>パイプライニングによる Task の並列実行</li>
|
|
140 <li>OpenCL、CUDA を用いた GPGPU 対応</li>
|
|
141 <li>データ並列実行</li>
|
|
142 <li>並列処理むけのI/O</li>
|
|
143 </ul>
|
|
144 <p>
|
|
145 Sort、WordCount、FFT といった例題を元に、これら Cerium の並列実行機構が
|
|
146 マルチプラットフォームにおける並列プログラミングで有効に作用することを示す。
|
|
147 </p>
|
|
148 </div>
|
|
149
|
|
150 <div class='slide'>
|
|
151 <h2>並列プログラミングフレームワーク Cerium</h2>
|
|
152 <p>
|
|
153 Cerium は Linux、MacOSX 上で動作する汎用計算用の並列プログラミングフレームワークである。
|
|
154 </p>
|
|
155 <img src="./images/cerium_image.png" width="700">
|
|
156 <p>Cerium を用いることでマルチコア CPU と GPU において Scheduling を含めたプログラミングを可能となる。</p>
|
|
157 </div>
|
|
158
|
|
159 <div class='slide'>
|
60
|
160 <h2>Cerium における Task の生成</h2>
|
58
|
161
|
|
162 <p>
|
|
163 Cerium TaskManager では処理の単位を Task としてプログラムを記述していく。
|
|
164 関数やサブルーチンを Task として扱い、Task に各種パラメタを設定した後に並列実行される。
|
|
165 Input データの各要素同士を乗算し、 Output に格納する Multiply という例題がある。
|
|
166 Multiply の例題を元に Cerium で Task が生成される様子を以下に示す。
|
|
167 </p>
|
|
168 <pre class="code">
|
|
169 void
|
|
170 multiply_init(TaskManager *manager, float *i_data1,
|
|
171 float *i_data2, float *o_data) {
|
|
172
|
|
173 // create task
|
|
174 HTask* multiply = manager->create_task(MULTIPLY_TASK);
|
|
175 multiply->set_cpu(spe_cpu);
|
|
176
|
|
177 // set indata
|
|
178 multiply->set_inData(0, i_data1, sizeof(float) * length);
|
|
179 multiply->set_inData(1, i_data2, sizeof(float) * length);
|
|
180
|
|
181 // set outdata
|
|
182 multiply->set_outData(0, o_data, sizeof(float) * length);
|
|
183
|
|
184 // set parameter
|
|
185 multiply−>set_param(0,(long)length);
|
|
186
|
|
187 // set device
|
|
188 multiply->set_cpu(SPE_ANY);
|
|
189
|
|
190 // spawn task
|
|
191 multiply−>spawn();
|
|
192 }
|
|
193 </pre>
|
|
194 </div>
|
|
195
|
|
196 <div class='slide'>
|
60
|
197 <h2>Cerium における Task の記述</h2>
|
|
198 <p>Device 側で実行される Task の記述を示す。</p>
|
|
199 <pre class="code">
|
|
200 static int
|
|
201 run(SchedTask ∗s) {
|
|
202 float ∗i_data1 = (float∗)s−>get_input(0); // get input
|
|
203 float ∗i_data2 = (float∗)s−>get_input(1); // get output
|
|
204 float ∗o_data = (float∗)s−>get_output(0); // get parameter
|
|
205 long length = (long)s−>get_param(0);
|
|
206
|
|
207 // calculate
|
|
208 for (int i=0; i<length; i++) {
|
|
209 o_data[i] = i_data1[i] ∗ i_data2[i];
|
|
210 }
|
|
211 return 0;
|
|
212 }
|
|
213 </pre>
|
|
214 <p>Host 側では Task を生成する際に様々なパラメタを設定しており、
|
|
215 Task にはそれを取得する API が用意されている。</p>
|
|
216 <table border="0" >
|
|
217 <tr bgcolor="palegreen">
|
|
218 <th align="center">API</th><th align="center">content</th>
|
|
219 </tr>
|
|
220
|
|
221 <tr bgcolor="dbffa3">
|
|
222 <th align="left" >get_input</th><th align="left">入力データのアドレスを取得</th>
|
|
223 </tr>
|
|
224 <tr bgcolor="palegreen">
|
|
225 <th align="left">get_output</th><th align="left">出力先データのアドレスを取得</th>
|
|
226 </tr>
|
|
227 <tr bgcolor="dbffa3">
|
|
228 <th align="left">get_param</th><th align="left">パラメータを取得</th>
|
|
229 </tr>
|
|
230 </table>
|
|
231 </div>
|
|
232
|
|
233 <div class='slide'>
|
|
234 <h2>TaskManager の構成</h2>
|
|
235 <div align="center">
|
|
236 <img src='images/createtask.png' width="700">
|
|
237 </div>
|
|
238 <ul>
|
|
239 <li>TaskManagerと各Threadsの間には Syncronized な Mail Queueがある。
|
|
240 <li>依存関係の解決された Task は TaskManager から Mail Queue に送られる。
|
|
241 <li>Task に設定された CPUType に対応した Threads が Mail Queue から Task を取得し、並列実行していく。
|
|
242 </ul>
|
|
243 </div>
|
|
244
|
|
245 <div class='slide'>
|
|
246 <h2>マルチコア CPU 上での並列実行</h2>
|
|
247 <div align="center">
|
|
248 <img src="images/pipeline.png" width="600">
|
|
249 </div>
|
|
250 <p>
|
|
251 Cerium は Cell 上で動作するフレームワークであったが MacOSX、Linux 上での並列実行に対応させた。
|
|
252 </p>
|
|
253 <p>
|
|
254 マルチコア CPU 上での並列実行は、Synchronized Queue とパイプラインによって実現されている。
|
|
255 TaskManager で依存関係を解決された Task は Scheduler に送信され、
|
|
256 Scheduler が持っているパイプラインの機構に沿って並列に実行する。
|
|
257 </p>
|
|
258 </div>
|
|
259
|
|
260 <div class='slide'>
|
|
261 <h2>マルチコア CPU におけるパイプラインの実装</h2>
|
|
262 <table>
|
|
263 <tr>
|
|
264 <th>
|
|
265 <pre class="code" align="left">void
|
|
266 Scheduler::run(SchedTaskBase* task1) {
|
|
267 SchedTaskBase* task2 = new SchedNop();
|
|
268 SchedTaskBase* task3 = new SchedNop();
|
|
269
|
|
270 // main loop
|
|
271 do {
|
|
272
|
|
273 task1->read();
|
|
274 task2->exec();
|
|
275 task3->write();
|
|
276
|
|
277 delete task3;
|
|
278
|
|
279 task3 = task2;
|
|
280 task2 = task1;
|
|
281 task1 = task1->next(this, 0);
|
|
282
|
|
283 } while (task1);
|
|
284
|
|
285 delete task3;
|
|
286 delete task2;
|
|
287 }</pre>
|
|
288 </th>
|
|
289 <th align="left">
|
|
290 <p>
|
|
291 Cerium の Task は SchedTask と呼ばれるデータ構造で表現されている。
|
|
292 SchedTask は read/exec/write のメソッドを持っており、
|
|
293 パイプラインの各ステージで段階的に実行される。
|
|
294 </p>
|
|
295 <p>
|
|
296 引数として TaskList を受け取り、List 内の Task をパイプライン実行する。
|
|
297 task3 が write を担当しており、write が終わった Task は終了となる。
|
|
298 </p>
|
|
299 <p>
|
|
300 終了した task は delete して良い。
|
|
301 task3=task2、task2=task1 と SchedTask をずらして行き、TaskList から 次の Task を読み込む。
|
|
302 </p>
|
|
303 </th>
|
|
304 </tr>
|
|
305 </table>
|
|
306 </div>
|
|
307
|
|
308 <div class='slide'>
|
|
309 <h2>DMA の prefetch を用いた改良</h2>
|
61
|
310
|
60
|
311 </div>
|
|
312
|
|
313 <div class='slide'>
|
|
314 <h2>マルチコア CPU におけるデータ並列</h2>
|
|
315 </div>
|
|
316
|
|
317 <div class='slide'>
|
61
|
318 <h2>GPU 上での並列実行</h2>
|
60
|
319 </div>
|
|
320
|
|
321 <div class='slide'>
|
|
322 <h2>GPGPU におけるパイプラインの実装</h2>
|
|
323 </div>
|
|
324
|
|
325 <div class='slide'>
|
|
326 <h2>GPGPU におけるデータ並列</h2>
|
|
327 </div>
|
|
328
|
|
329 <div class='slide'>
|
|
330 <h2>Cerium の I/O(mmap による読み込み)</h2>
|
|
331 </div>
|
|
332
|
|
333 <div class='slide'>
|
|
334 <h2>BlockedRead による I/O の並列化</h2>
|
|
335 </div>
|
|
336
|
|
337 <div class='slide'>
|
|
338 <h2>I/O 専用のThread</h2>
|
|
339 </div>
|
|
340
|
|
341 <div class='slide'>
|
|
342 <h2>実験に利用する例題-Sort-</h2>
|
|
343 </div>
|
|
344
|
|
345 <div class='slide'>
|
|
346 <h2>実験に利用する例題-WordCount-</h2>
|
|
347 </div>
|
|
348
|
|
349 <div class='slide'>
|
|
350 <h2>実験に利用する例題-FFT-</h2>
|
|
351 </div>
|
|
352
|
|
353 <div class='slide'>
|
|
354 <h2>実験環境</h2>
|
|
355 </div>
|
|
356
|
|
357 <div class='slide'>
|
|
358 <h2>マルチコア CPU による並列実行のベンチマーク</h2>
|
|
359 </div>
|
|
360
|
|
361 <div class='slide'>
|
|
362 <h2>DMA の prefecth に関するベンチマーク </h2>
|
|
363 </div>
|
|
364
|
|
365 <div class='slide'>
|
|
366 <h2>GPGPU のベンチマーク</h2>
|
|
367 </div>
|
|
368
|
|
369 <div class='slide'>
|
|
370 <h2>データ並列実行のベンチマーク</h2>
|
|
371 </div>
|
|
372
|
|
373 <div class='slide'>
|
|
374 <h2>GPGPU のベンチマーク</h2>
|
|
375 </div>
|
|
376
|
|
377 <div class='slide'>
|
|
378 <h2>FFT による GPGPU のベンチマーク</h2>
|
|
379 </div>
|
|
380
|
|
381 <div class='slide'>
|
|
382 <h2>BlockedRead による並列 I/O のベンチマーク</h2>
|
|
383 </div>
|
|
384
|
|
385 <div class='slide'>
|
|
386 <h2>まとめ</h2>
|
|
387 </div>
|
|
388
|
|
389 <div class='slide'>
|
|
390 <h2>今後の課題</h2>
|
58
|
391 </div>
|
|
392
|
|
393 </div> <!-- presentation -->
|
|
394 </bodypp>
|
|
395 </html>
|