Mercurial > hg > Papers > 2014 > masakoha-thesis > final
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 < length;i++) { | 107 for (int i=0;i < 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) |