comparison slide/index.html @ 24:563a4c69048b

fix slide
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Mon, 10 Feb 2014 18:55:56 +0900
parents a452d8f104bd
children 3385af0bca0f
comparison
equal deleted inserted replaced
23:a452d8f104bd 24:563a4c69048b
29 </article> 29 </article>
30 30
31 <article class='smaller'> 31 <article class='smaller'>
32 <h3>研究背景と目的</h3> 32 <h3>研究背景と目的</h3>
33 <p> 33 <p>
34 近年のCPUのほとんどはマルチコアであり、それらの性能を引き出すためには並列プログラミングが必須となっている。そこで当研究室では Cerium Library の開発を行い、提供することによって並列プログラミングを容易にしている。 34 近年のCPUのほとんどはマルチコアであり、それらの性能を引き出すためには並列プログラミングが必須となっている。
35 そこで当研究室では、並列プログラミング用フレームワーク、Cerium Task Manager の開発を行い、提供することによって並列プログラミングを容易にしている。
35 </p> 36 </p>
36 <p> 37 <p>
37 先行研究では Task の並列化によって、プログラム全体の処理速度は向上している。しかし、ファイル読み込み等の I/O と Task が並列に動作するようにはされていない。 38 先行研究では Task の並列化によって、プログラム全体の処理速度は向上している。しかし、ファイル読み込み等の I/O と Task が並列に動作するようにはされていない。
38 </p> 39 </p>
39 <p> 40 <p>
43 本研究では I/O と Task が並列に動作するような設計、実装によってプログラム全体の 44 本研究では I/O と Task が並列に動作するような設計、実装によってプログラム全体の
44 処理速度を上げていく。 45 処理速度を上げていく。
45 </p> 46 </p>
46 </article> 47 </article>
47 48
48 <article > 49 <article>
49 <h3>Cerium とは</h3> 50 <h3>Cerium Task Manager の流れ</h3>
50 <p>
51 </p>
52 <p>
53 </p>
54 <p>
55 </p>
56 </article>
57
58 <article>
59 <h3>Cerium の流れ</h3>
60 <table border="0" cellpadding="0" cellspacing="0"> 51 <table border="0" cellpadding="0" cellspacing="0">
61 <tbody> 52 <tbody>
62 <tr> 53 <tr>
63 <td><img src='images/cerium.png' style="height:350px"></td> 54 <td><img src='images/cerium.png' style="height:350px"></td>
64 <td> 55 <td>
65 <ol> 56 <ol>
66 <li>Taskを生成</li> 57 <font size=5>
67 <li>依存関係のチェック</li> 58 <li>Taskを生成後、Task Managerにて Task の管理、依存関係のチェック</li>
68 <li>Schedulerに転送</li> 59 <li>TaskList に生成された Task を set </li>
60 <li>Task を各 Scheduler に転送</li>
69 <li>並列実行</li> 61 <li>並列実行</li>
62 </font>
70 </ol> 63 </ol>
71 </td> 64 </td>
72 </tr> 65 </tr>
73 </tbody> 66 </tbody>
74 </table> 67 </table>
75 </article> 68 </article>
76 69
77 <article> 70 <article>
78 <h3>Cerium Task の生成(1)</h3> 71 <h3>Cerium Task の生成の例(1)</h3>
79 <br> 72 <p>(例題) multiply : 2つの数を掛け算するプログラム</p>
80 <h3 class="yellow">main.cc の記述</h3> 73 <h3 class="yellow">main.cc の記述</h3>
81 <pre> 74 <pre>
75 float* A, B, C;
82 // Task の宣言 76 // Task の宣言
83 HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); 77 HTaskPtr multiply = manager->create_task(MULTIPLY_TASK);
84 // Task を実行する デバイスの設定 78 // Task を実行する デバイスの設定
85 multiply->set_cpu(SPE_ANY); 79 multiply->set_cpu(SPE_ANY);
86 // Task に入力データのアドレスを追加 80 // Task に入力データのアドレスを追加
87 multiply->set_inData(0, i_data1, sizeof(float)*length); 81 multiply->set_inData(0, (memaddr)A, sizeof(float)*length);
88 multiply->set_inData(1, i_data2, sizeof(float)*length); 82 multiply->set_inData(1, (memaddr)B, sizeof(float)*length);
89 // Task に出力データのアドレスを追加 83 // Task に出力データのアドレスを追加
90 multiply->set_outData(0, o_data1, sizeof(float)*length); 84 multiply->set_outData(0, (memaddr)C, sizeof(float)*length);
91 // Task へ値を1つだけ渡す 85 // Task へ値を1つだけ渡す
92 multiply->set_param(0,(long)length); 86 multiply->set_param(0,length);
93 // Task を TaskList に set する 87 // Task を TaskList に set する
94 multiply->spawn(); </pre> 88 multiply->spawn(); </pre>
95 </article> 89 </article>
96 90
97 <article> 91 <article>
100 <h3 class="yellow">Task の記述</h3> 94 <h3 class="yellow">Task の記述</h3>
101 <pre> 95 <pre>
102 static int 96 static int
103 multiply(SchedTask *s,void *rbuf, void *wbuf) 97 multiply(SchedTask *s,void *rbuf, void *wbuf)
104 { 98 {
99 float *A,*B,*C
105 // 登録した inData を取得 100 // 登録した inData を取得
106 float indata1=(float*)s->get_input(rbuf,0); 101 A = (float*)s->get_input(rbuf,0);
107 float indata2=(float*)s->get_input(rbuf,1); 102 B = (float*)s->get_input(rbuf,1);
108 // 登録した outData を取得 103 // 登録した outData を取得
109 float outdata=(float*)s->get_output(wbuf,0); 104 C = (float*)s->get_output(wbuf,0);
110 // 登録した param を取得 105 // 登録した param を取得
111 long length=(long)s->get_param(0); 106 long length=(long)s->get_param(0);
112 for (int i=0;i &lt; length;i++) { 107 for (int i=0;i &lt; length;i++) {
113 outdata[i]=indata1[i]*indata2[i]; 108 C[i] = A[i] * B[i];
114 } 109 }
115 return 0; 110 return 0;
116 } </pre> 111 } </pre>
117 </article> 112 </article>
118 113
120 <h3>並列処理向け I/O の 設計と実装</h3> 115 <h3>並列処理向け I/O の 設計と実装</h3>
121 <br> 116 <br>
122 <ul> 117 <ul>
123 <li>mmap での実装</li> 118 <li>mmap での実装</li>
124 <li>Block Read の実装</li> 119 <li>Block Read の実装</li>
125 <li>Cerium の改良(IO_0 の追加)</li>
126 </ul> 120 </ul>
127 </article> 121 </article>
128 122
129 <article> 123 <article>
130 <h3>mmap での I/O の実装(1)</h3> 124 <h3>mmap での I/O の実装(1)</h3>
253 </li> 247 </li>
254 </ul> 248 </ul>
255 </article> 249 </article>
256 --> 250 -->
257 251
258 <article> 252
259 <h3>Block Read の設計(2/2)</h3> 253
260 <br> 254 <article class='smaller'>
261 <img src='images/blockread.png' style="height:250px"> 255 <h3>Block Read の実装(1/3)</h3>
262 <br>
263
264 <ol>
265 <li>
266 </li>
267 <li>
268 </li>
269 <li>
270 </li>
271 <li>
272 </li>
273 </ol>
274 </article>
275
276
277 <article>
278 <h3>Block Read の実装(2)</h3>
279 <br> 256 <br>
280 <h3 class="yellow">Block Read の実装</h3> 257 <h3 class="yellow">Block Read の実装</h3>
281 <pre> 258 <pre>
282 HTaskPtr t_read = manager->create_task(READ_TASK); 259 HTaskPtr t_read = manager->create_task(READ_TASK);
283 t_read->set_cpu(read_spe_cpu); 260 t_read->set_cpu(read_spe_cpu);
261 // 読み出すファイルの格納場所を設定
262 t_read->set_outData(0,
263 w->file_mmap + w->task_spawned * w->division_size,
264 w->task_blocks * w->division_size);
265 // ファイルディスクリプタの受け渡し
284 t_read->set_param(0,w->fd); 266 t_read->set_param(0,w->fd);
267 // ファイル読み込みの始点
285 t_read->set_param(1,w->task_spawned*w->division_size); 268 t_read->set_param(1,w->task_spawned*w->division_size);
286 t_read->set_outData(0, w->file_mmap + w->task_spawned * w->division_size, 269
287 w->task_blocks * w->division_size); 270 // run_tasks(manager,w, w->task_blocks, t_read, t_next, w->division_size + w->extra_len);
288 271 // ここで、ファイルに対して何らかの計算を掛けるような Task を設定する
289 run_tasks(manager,w, w->task_blocks, t_read, t_next, 272 run_tasks(manager,w, w->task_blocks,・・・ );
290 w->division_size + w->extra_len); 273
291 274 // ファイル読み込みの終点
292 t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len); 275 t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len);
293 276
294 t_read->spawn(); 277 t_read->spawn();
295 278
296 </pre> 279 </pre>
297 </article> 280 </article>
298 281
299 <article> 282 <article>
300 <h3>Block Read の実装(3)</h3> 283 <h3>Block Read の実装(2/3)</h3>
284 <br>
285 <img src='images/blockread.png' style="height:250px">
286 <br>
287
288 <ol>
289 <li>
290 </li>
291 <li>
292 </li>
293 <li>
294 </li>
295 <li>
296 </li>
297 </ol>
298 </article>
299
300
301 <article>
302 <h3>Block Read の実装(3/3)</h3>
301 <br> 303 <br>
302 <h3 class="yellow"> Block Read の記述</h3> 304 <h3 class="yellow"> Block Read の記述</h3>
303 <pre> 305 <pre>
304 static int 306 static int
305 read_task(SchedTask *s, void *rbuf, void *wbuf) 307 read_task(SchedTask *s, void *rbuf, void *wbuf)