Mercurial > hg > Papers > 2014 > masakoha-thesis > final
changeset 27:9def91a908d6
add
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Feb 2014 18:11:36 +0900 |
parents | 54591c145fec |
children | 933c669d567e |
files | slide/images/blockread.graffle slide/images/blockread.png slide/index.html |
diffstat | 3 files changed, 82 insertions(+), 157 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/images/blockread.graffle Tue Feb 11 15:47:57 2014 +0900 +++ b/slide/images/blockread.graffle Tue Feb 11 18:11:36 2014 +0900 @@ -26,7 +26,7 @@ <key>MasterSheets</key> <array/> <key>ModificationDate</key> - <string>2014-02-11 05:26:28 +0000</string> + <string>2014-02-11 08:18:18 +0000</string> <key>Modifier</key> <string>MasaKoha</string> <key>NotesVisible</key> @@ -1034,7 +1034,7 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs24 \cf0 Block Read Task 2}</string> +\f0\fs24 \cf0 Blocked Read Task 2}</string> <key>VerticalPad</key> <integer>0</integer> </dict> @@ -1201,7 +1201,7 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs24 \cf0 Block Read}</string> +\f0\fs24 \cf0 Blocked Read}</string> <key>VerticalPad</key> <integer>0</integer> </dict> @@ -1275,7 +1275,7 @@ {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc -\f0\fs24 \cf0 Block Read Task 1}</string> +\f0\fs24 \cf0 Blocked Read Task 1}</string> <key>VerticalPad</key> <integer>0</integer> </dict> @@ -4070,7 +4070,7 @@ <key>WindowInfo</key> <dict> <key>CurrentSheet</key> - <integer>3</integer> + <integer>0</integer> <key>ExpandedCanvases</key> <array/> <key>Frame</key> @@ -4088,7 +4088,7 @@ <key>SidebarWidth</key> <integer>120</integer> <key>VisibleRegion</key> - <string>{{-53, 0}, {665.71428571428567, 422.28571428571428}}</string> + <string>{{0, 0}, {665.71428571428567, 422.28571428571428}}</string> <key>Zoom</key> <real>1.75</real> <key>ZoomValues</key>
--- a/slide/index.html Tue Feb 11 15:47:57 2014 +0900 +++ b/slide/index.html Tue Feb 11 18:11:36 2014 +0900 @@ -38,14 +38,29 @@ 先行研究では Task の並列化によって、プログラム全体の処理速度は向上している。しかし、ファイル読み込み等の I/O と Task が並列に動作するようにはされていない。 </p> <p> - 現状では、ファイルを全て memory に mapping を行ってから Task が走るようになっているので、非常に大きいサイズのファイルを読み込むと、ファイルを memory に mapping するまでの時間がオーバーヘッドになってしまう。 + 現状では、ファイルを memory に mapping を行ってから Task が走るようになっているので、I/O と Task が並列に動作しない。 </p> <p> 本研究では I/O と Task が並列に動作するような設計、実装によってプログラム全体の - 処理速度を上げていく。 + 並列度、及び処理速度を上げていく。 </p> </article> + + <article> + <h3>mmapでの実装の問題点</h3> + <ul> + <li> + mmap で file を読み込むと、file は memory 上にて即座には展開されない。 + </li> + <li> + file が memory に展開されるタイミングは、その file に対して何らかの計算を行うときである。<br><br> + →つまり、Task が走るときに初めて memory に file を格納するので、I/O と Task が分離できない。 + </li> + </ul> + </article> + +<!-- <article> <h3>Cerium Task Manager の流れ</h3> <table border="0" cellpadding="0" cellspacing="0"> @@ -66,60 +81,16 @@ </tbody> </table> </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>並列処理向け I/O の 設計と実装</h3> <br> <ul> <li>I/O を含む Task の説明</li> - <li>mmap での実装</li> <li>mmap の説明</li> - <li>Block Read の設計</li> - <li>Block Read の実装</li> + <li>Blocked Read の設計と実装</li> + <li>ベンチマーク</li> </ul> </article> @@ -128,7 +99,7 @@ <br> <img src='images/includeIOTask.png' style="height:250px"> <ol> - <li>file mmaping 後、file をある一定の大きさに分割する</li> + <li>file mapping 後、file をある一定の大きさに分割する</li> <li>分割した file に対して、それぞれ計算を行う</li> <li>計算した結果を集計する</li> </ol> @@ -136,31 +107,6 @@ <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> - - <article> <h3>mmap の説明</h3> <table border="0" cellpadding="0" cellspacing="0"> <tbody> @@ -193,7 +139,7 @@ </article> <article> - <h3>Block Read の設計</h3> + <h3>Blocked Read の設計</h3> <br> <img src='images/divide_read.png' style="height:250px"> <br> @@ -206,9 +152,6 @@ 先読みを自分で書ける(制御できる) </li> <li> - code が煩雑 - </li> - <li> memory より大きなファイルを扱える </li> </ul> @@ -253,38 +196,8 @@ </article> --> - - <article class='smaller'> - <h3>Block Read の実装(1/3)</h3> - <br> - <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); - -// 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> - </article> - - <article class='smaller'> - <h3>Block Read の実装(2/3)</h3> + <h3>Blocked Read の実装</h3> <br> <img src='images/blockread.png' style="height:250px"> <br> @@ -297,38 +210,17 @@ </li> <li> Task 1つ当たりの読み込む領域を L とする。<br> - Block Read Task 1つ当たり、memory に格納する大きさは L × n となる。 + Blocked Read Task 1つ当たり、memory に格納する大きさは L × n となる。 </li> <li> - Block Read Task が読み込み終わるまで、Task Block に wait を掛ける。<br> + Blocked Read Task が読み込み終わるまで、Task Block に wait を掛ける。<br> (Read Task が格納する前に走ると、まだ格納していない領域を読みこんでしまう。) </li> </ul> </article> - <article> - <h3>Block Read の実装(3/3)</h3> - <br> - <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> - </article> - - <article> - <h3>ベンチマーク(1/)</h3> + <h3>ベンチマーク(1/3)</h3> <br> <h3 class="yellow">実験環境</h3> <ul> @@ -345,10 +237,18 @@ </article> <article class = 'smaller'> - <h3>ベンチマーク(2/)</h3> - <p> - file が memory に残っていない状態での測定 - </p> + <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"> @@ -356,8 +256,6 @@ <tr> <td>read mode</td> <td>cpu num</td> - <td>one task size</td> - <td>task blocks</td> <td>min time(s)</td> <td>MAX time(s)</td> <td>ave time(s)</td> @@ -365,8 +263,6 @@ <tr> <td>mmap</td> <td>4</td> - <td>128kbyte</td> - <td>48</td> <td>135.2</td> <td>148.9</td> <td>142.3</td> @@ -374,8 +270,6 @@ <tr> <td>BRead</td> <td>4</td> - <td>128kbyte</td> - <td>48</td> <td>94.5</td> <td>109.2</td> <td>98.8</td> @@ -384,8 +278,6 @@ <tr> <td>mmap</td> <td>12</td> - <td>128kbyte</td> - <td>48</td> <td>147.0</td> <td>181.8</td> <td>154.6</td> @@ -393,8 +285,6 @@ <tr> <td>BRead</td> <td>12</td> - <td>128kbyte</td> - <td>48</td> <td>91.6</td> <td>117.5</td> <td>99.2</td> @@ -402,8 +292,22 @@ </tbody> </table> + </article> + <article class = 'smaller'> + <h3>ベンチマーク(3/3)</h3> <h3 class="yellow">考察</h3> + <ul> + <li> + mmap より、Blocked Readのほうが % ほど速くなった + </li> + <li> + I/O と Task が分離できた。 + </li> + <li> + </li> + </ul> + </article> <article> @@ -414,15 +318,36 @@ さらなる 並列処理向け I/O の動作を改善 </li> <li> - 分散バージョン I/0 の設計と実装 - </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> </body> </html> + </ul> + + </article> + + </body> +</html>