Mercurial > hg > Papers > 2014 > masakoha-thesis > final
diff slide/index.html @ 28:933c669d567e
add
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Feb 2014 20:08:48 +0900 |
parents | 9def91a908d6 |
children | f8fc309caf84 |
line wrap: on
line diff
--- a/slide/index.html Tue Feb 11 18:11:36 2014 +0900 +++ b/slide/index.html Tue Feb 11 20:08:48 2014 +0900 @@ -90,6 +90,10 @@ <li>I/O を含む Task の説明</li> <li>mmap の説明</li> <li>Blocked Read の設計と実装</li> +<<<<<<< local + <li>IO専用 therad の追加</li> +======= +>>>>>>> other <li>ベンチマーク</li> </ul> </article> @@ -105,7 +109,10 @@ </ol> </article> +<<<<<<< local +======= +>>>>>>> other <article> <h3>mmap の説明</h3> <table border="0" cellpadding="0" cellspacing="0"> @@ -196,6 +203,7 @@ </article> --> +<<<<<<< local <article class='smaller'> <h3>Blocked Read の実装</h3> <br> @@ -219,6 +227,28 @@ </ul> </article> + <article class = 'smaller'> + <h3>I/O 専用の therad を追加 (1/2)</h3> + <br> + <img src='images/SPEANYblockread.png' style="height:400px"> + <ol> + <li>file mapping 後、file をある一定の大きさに分割する</li> + <li>分割した file に対して、それぞれ計算を行う</li> + <li>計算した結果を集計する</li> + </ol> + </article> + + <article> + <h3>I/O 専用の therad を追加 (2/2)</h3> + <br> + <img src='images/IO0blockread.png' style="height:250px"> + <ol> + <li>file mapping 後、file をある一定の大きさに分割する</li> + <li>分割した file に対して、それぞれ計算を行う</li> + <li>計算した結果を集計する</li> + </ol> + </article> + <article> <h3>ベンチマーク(1/3)</h3> <br> @@ -294,6 +324,294 @@ </article> + + <article> + <h3>まとめ</h3> + <br> + <ul> + <li> + mmap より、Blocked Readのほうが % ほど速くなった + </li> + <li> + I/O と Task の分離が成功した + </li> + </ul> + + </article> + + <article> + <h3>大学院に進学してしたいこと</h3> + <br> + <ul> + <li> + さらなる 並列処理向け I/O の動作を改善 + </li> + <li> + I/O を利用した、マルチコアソフトウェアシンセサイザーを設計 + </li> + </ul> + + </article> + + + <article> + <h3>大学院に進学してしたいこと</h3> + <br> + <ul> + <li> + さらなる 並列処理向け I/O の動作を改善 + </li> + <li> + I/O を利用した、マルチコアソフトウェアシンセサイザーを設計 + </li> + </ul> + + </article> + + <article> + <h3>マルチコアソフトウェアシンセサイザーの設計</h3> + <br> + <ul> + <li> + 作曲をする際にはマシンパワーが必要となることが多い。 + </li> + <li> + ソフトウェアシンセサイザー(以下、シンセサイザー)を使用する際にマシンパワーが必要となる。 + </li> + <li> + シンセサイザーは1つだけで立ち上げる物ではなく、複数立ち上げる物なので、1つ1つの負荷を抑えることがキーポイントとなる。 + </li> + <li> + シンセサイザーは様々なフィルターをかけることで音を作っていくのだが、フィルターを重ねても動作軽量なプログラムを作る。 + </li> + </ul> + </article> + + <article> + <h3>付録 : Cerium Task の生成の例(1)</h3> + <p>(例題) multiply : 2つの数を掛け算するプログラム</p> + <h3 class="yellow">main.cc の記述</h3> + <pre> +float* A, B, C; +// Task の宣言 +HTaskPtr multiply = manager->create_task(MULTIPLY_TASK); +// Task を実行する デバイスの設定 +multiply->set_cpu(SPE_ANY); +// Task に入力データのアドレスを追加 +multiply->set_inData(0, (memaddr)A, sizeof(float)*length); +multiply->set_inData(1, (memaddr)B, sizeof(float)*length); +// Task に出力データのアドレスを追加 +multiply->set_outData(0, (memaddr)C, sizeof(float)*length); +// Task へ値を1つだけ渡す +multiply->set_param(0,length); +// Task を TaskList に set する +multiply->spawn(); </pre> + </article> + + <article> + <h3>付録 : Cerium Task の生成(2)</h3> + <br> + <h3 class="yellow">Task の記述</h3> + <pre> +static int +multiply(SchedTask *s,void *rbuf, void *wbuf) +{ + float *A,*B,*C + // 登録した inData を取得 + A = (float*)s->get_input(rbuf,0); + B = (float*)s->get_input(rbuf,1); + // 登録した outData を取得 + C = (float*)s->get_output(wbuf,0); + // 登録した param を取得 + long length=(long)s->get_param(0); + for (int i=0;i < length;i++) { + C[i] = A[i] * B[i]; + } + return 0; +} </pre> + </article> + + <article> + <h3>付録 : mmap での I/O の実装</h3> + <br> + <h3 class="yellow">mmap の記述</h3> + <pre> +mmap(SchedTask *s, void *in, void *out) +{ + // FileReadPtr : File情報などを格納している構造体 + FileReadPtr fr = (FileReadPtr)in; + int map = MAP_PRIVATE; + + fr->read_text = + (char*)mmap(NULL,fr->filesize,PROT_READ,map,fr->fd,(off_t)0); +} +</pre> + <ul> + <li> + PROT_READ : 読み込み可 + </li> + <li> + MAP_PRIVATE : 読み込んだ領域に対して書き込みが起こると複製し、複製した領域に対して書き込みを行う + </li> + </ul> + </article> + +======= +>>>>>>> other + <article class='smaller'> +<<<<<<< local + <h3>付録 : Block Read の実装(1/2)</h3> +======= + <h3>Blocked Read の実装</h3> +>>>>>>> other + <br> +<<<<<<< local + <h3 class="yellow">Block Read の実装</h3> + <pre> +HTaskPtr t_read = manager->create_task(READ_TASK); +t_read->set_cpu(read_spe_cpu); +// 読み出すファイルの格納場所を設定 +t_read->set_outData(0, + w->file_mmap + w->task_spawned * w->division_size, + w->task_blocks * w->division_size); +// ファイルディスクリプタの受け渡し +t_read->set_param(0,w->fd); +// ファイル読み込みの始点 +t_read->set_param(1,w->task_spawned*w->division_size); +======= + <img src='images/blockread.png' style="height:250px"> + <br> +>>>>>>> other + +<<<<<<< local +// run_tasks(manager,w, w->task_blocks, t_read, t_next, w->division_size + w->extra_len); +// ここで、ファイルに対して何らかの計算を掛けるような Task を設定する +run_tasks(manager,w, w->task_blocks,・・・ ); + +// ファイル読み込みの終点 +t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len); + +t_read->spawn(); + +</pre> +======= + <ul> + <li> + Task を 1 つずつ生成するのではなく、ブロック単位で生成する。<br> + この図では、1 Block 当たり n 個の Task を生成する。<br> + (1つずつ生成すると、生成された Task で memory を圧迫するため) + </li> + <li> + Task 1つ当たりの読み込む領域を L とする。<br> + Blocked Read Task 1つ当たり、memory に格納する大きさは L × n となる。 + </li> + <li> + Blocked Read Task が読み込み終わるまで、Task Block に wait を掛ける。<br> + (Read Task が格納する前に走ると、まだ格納していない領域を読みこんでしまう。) + </li> + </ul> +>>>>>>> other + </article> + + <article> +<<<<<<< local + <h3>付録 : Block Read の実装(2/2)</h3> +======= + <h3>ベンチマーク(1/3)</h3> +>>>>>>> other + <br> +<<<<<<< local + <h3 class="yellow"> Block Read の記述</h3> + <pre> +static int +read_task(SchedTask *s, void *rbuf, void *wbuf) +{ + long fd = (long)s->get_param(0); + long start_read_position = (long)s->get_param(1); + long end_read_position = (long)s->get_param(2); + char *read_text = (char*)s->get_output(wbuf,0); + long read_size = end_read_position - start_read_position; + + pread(fd, read_text, read_size , start_read_position); + return 0; +} +</pre> +======= + <h3 class="yellow">実験環境</h3> + <ul> + <li> Mac OS X 10.9.1</li> + <li> 2*2.66 GHz 6-Core Intel Xeon</li> + <li> Memory 16GB 1333MHz DDR3</li> + <li> HHD 1TB</li> + <li> file size : 約 10 GB</li> + <li> + "doing" という文字列が file 内にいくつあるか計算<br> + ("doing" は 25,961,792 個存在する) + </li> + </ul> +>>>>>>> other + </article> + +<<<<<<< local +======= + <article class = 'smaller'> + <h3>ベンチマーク(2/3)</h3> + <ul> + <li> + file が memory に残っていない状態での測定 + </li> + <li> + one task size 128KByte + </li> + <li> + Task Blocks 48 + </li> + </ul> + <br> + <h3 class="yellow">結果</h3> + <table border="0" cellpadding="0" cellspacing="0"> + <tbody> + <tr> + <td>read mode</td> + <td>cpu num</td> + <td>min time(s)</td> + <td>MAX time(s)</td> + <td>ave time(s)</td> + </tr> + <tr> + <td>mmap</td> + <td>4</td> + <td>135.2</td> + <td>148.9</td> + <td>142.3</td> + </tr> + <tr> + <td>BRead</td> + <td>4</td> + <td>94.5</td> + <td>109.2</td> + <td>98.8</td> + </tr> + + <tr> + <td>mmap</td> + <td>12</td> + <td>147.0</td> + <td>181.8</td> + <td>154.6</td> + </tr> + <tr> + <td>BRead</td> + <td>12</td> + <td>91.6</td> + <td>117.5</td> + <td>99.2</td> + </tr> + </tbody> + </table> + + </article> + <article class = 'smaller'> <h3>ベンチマーク(3/3)</h3> <h3 class="yellow">考察</h3> @@ -342,6 +660,7 @@ </li> </ul> </article> +>>>>>>> other </body> </html>