view slide/index.html @ 23:a452d8f104bd

divede read rename to Block Read
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Sun, 09 Feb 2014 17:14:11 +0900
parents dd04469c2ae9
children 563a4c69048b
line wrap: on
line source

<!DOCTYPE html>

<html>
  <head>
    <title>Presentation</title>

    <meta charset='utf-8'>
    <script
       src='./slides.js'></script>
  </head>

  <style>
    /* Your individual styles here, or just use inline styles if that’s
    what you want. */

  </style>

  <body style='display: none'>
    <section class='slides layout-regular template-default'>

      <!-- 
           Your slides (<article>s) go here. Delete or comment out the
           slides below.
        -->
      <article >
        <h1>Cerium による並列処理向け I/O の設計と実装</h1>
        <h3 class="title">Masataka Kohagura 12th, February</h3>
        <div align="right">担当教官 : 河野 真治</div>
      </article>

        <article class='smaller'>
        <h3>研究背景と目的</h3>
        <p>
        近年のCPUのほとんどはマルチコアであり、それらの性能を引き出すためには並列プログラミングが必須となっている。そこで当研究室では Cerium Library の開発を行い、提供することによって並列プログラミングを容易にしている。
        </p>
        <p>
        先行研究では Task の並列化によって、プログラム全体の処理速度は向上している。しかし、ファイル読み込み等の I/O と Task が並列に動作するようにはされていない。
        </p>
        <p>
        現状では、ファイルを全て memory に mapping を行ってから Task が走るようになっているので、非常に大きいサイズのファイルを読み込むと、ファイルを memory に mapping するまでの時間がオーバーヘッドになってしまう。
        </p>
        <p>
        本研究では I/O と Task が並列に動作するような設計、実装によってプログラム全体の
        処理速度を上げていく。
        </p>
      </article>

      <article >
        <h3>Cerium とは</h3>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
      </article>

      <article>
        <h3>Cerium の流れ</h3>
        <table  border="0" cellpadding="0" cellspacing="0">
          <tbody>
            <tr>
              <td><img src='images/cerium.png' style="height:350px"></td>
              <td>
                <ol>
                  <li>Taskを生成</li>
                  <li>依存関係のチェック</li>
                  <li>Schedulerに転送</li>
                  <li>並列実行</li>
                </ol>
              </td>
            </tr>
          </tbody>
        </table>
      </article>

      <article>
        <h3>Cerium Task の生成(1)</h3>
          <br>
          <h3 class="yellow">main.cc の記述</h3>
        <pre>
// Task の宣言
HTaskPtr multiply = manager->create_task(MULTIPLY_TASK);
// Task を実行する デバイスの設定
multiply->set_cpu(SPE_ANY);
// Task に入力データのアドレスを追加
multiply->set_inData(0, i_data1, sizeof(float)*length);
multiply->set_inData(1, i_data2, sizeof(float)*length);
// Task に出力データのアドレスを追加
multiply->set_outData(0, o_data1, sizeof(float)*length);
// Task へ値を1つだけ渡す
multiply->set_param(0,(long)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)
{
    // 登録した inData を取得
    float indata1=(float*)s->get_input(rbuf,0);
    float indata2=(float*)s->get_input(rbuf,1);
    // 登録した outData を取得
    float outdata=(float*)s->get_output(wbuf,0);
    // 登録した param を取得
    long  length=(long)s->get_param(0);
    for (int i=0;i &lt; length;i++) {
        outdata[i]=indata1[i]*indata2[i];
    }
    return 0;
} </pre>
      </article>

      <article>
        <h3>並列処理向け I/O の 設計と実装</h3>
          <br>
          <ul>
            <li>mmap での実装</li>
            <li>Block Read の実装</li>
            <li>Cerium の改良(IO_0 の追加)</li>
          </ul>
      </article>

      <article>
        <h3>mmap での I/O の実装(1)</h3>
        <br>
          <h3 class="yellow">FileRead.h の一部</h3>
        <pre>
typedef struct fileRead {
    struct fileRead *self;
    long fd;
    long division_size;
    long file_size;
        ・・・
    char *read_text;
    CPU_TYPE cpu;
} FileRead, *FileReadPtr;
</pre>
    <p>
    Fileを読み込む際にファイルの情報や、Read Task の情報を構造体の中に格納しておく。
    </p>
      </article>

      <article>
        <h3>mmap での I/O の実装(2)</h3>
          <br>
          <h3 class="yellow">mmap の記述</h3>
        <pre>
mmap(SchedTask *s, void *in, void *out)
{
    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>
      </article>

      <article>
        <h3>mmap の仕様</h3>
        <table  border="0" cellpadding="0" cellspacing="0">
          <tbody>
            <tr>
              <td><img src='images/mmap.png' style="height:350px"></td>
              <td>
                <ol>
                <font size = 5>
                  <li>
                  code がシンプル (memory を自分自身で malloc せず、read を書いて読み込まなくていいため)
                  </li>
                  <li>
                  memory より大きなファイルは開けない
                  </li>
                  <li>
                  ファイルを一度で memory に対して mapping する
                  </li>
                  <li>
                  read の先読みがOS依存
                  </li>
                  </font>
                </ol>
              </td>
            </tr>
          </tbody>
        </table>

        <ul>
        </ul>
      </article>

      <article>
        <h3>Block Read の設計(1/2)</h3>
          <br>
          <img src='images/divide_read.png' style="height:250px">
          <br>

        <ul>
          <li>
          明示的な read
          </li>
          <li>
          先読みを自分で書ける(制御できる)
          </li>
          <li>
          code が煩雑
          </li>
          <li>
          memory より大きなファイルを扱える
          </li>
        </ul>
      </article>

<!--
      <article>
        <h3>divide read の実装(1)</h3>
          <br>
          <h3 class="yellow">Read Task の ブロック化</h3>
        <pre>
program_run(TaskManager *manager, char *filename)
{
    FileReadPtr fr = (FileReadPtr)manager->allocate(sizeof(FileRead));
    fr->self = fr;
    fr->fd = fd;
    ・・・
    read = manager->create_task(RUN_READ_BLOCKS,
        (memaddr)&fr->self, sizeof(memaddr),read_text,fr->filesize);

    read->spawn();
}
</pre>
      </article>

      <article>
        <h3>divide read の実装(2)</h3>
          <br>
          <ul>
            <li>
            divide read Task の実行の際に、ブロック単位で Task の生成、実行を行う。
            </li>
            <li>
            1つずつ生成すると Task の数だけ memory address が取られるために肥大化してしまう。
            </li>
            <li>
            しかしブロック単位で生成すると、同じ変数を使用しているので memory の節約になる。
            </li>

            </li>
        </ul>
      </article>
-->

      <article>
        <h3>Block Read の設計(2/2)</h3>
          <br>
          <img src='images/blockread.png' style="height:250px">
          <br>

        <ol>
          <li>
          </li>
          <li>
          </li>
          <li>
          </li>
          <li>
          </li>
        </ol>
      </article>


      <article>
        <h3>Block Read の実装(2)</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_param(0,w->fd);
t_read->set_param(1,w->task_spawned*w->division_size);
t_read->set_outData(0, w->file_mmap + w->task_spawned * w->division_size,
                        w->task_blocks * w->division_size);

run_tasks(manager,w, w->task_blocks, t_read, t_next,
                     w->division_size + w->extra_len);

t_read->set_param(2,w->task_spawned*w->division_size + w->extra_len);

t_read->spawn();

</pre>
      </article>

      <article>
        <h3>Block Read の実装(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>ベンチマーク</h3>
          <br>
          <h3 class="yellow">考察</h3>
      </article>

      <article>
        <h3>まとめ</h3>
          <br>
      </article>

      <article>
        <h3>大学院に進学してしたいこと</h3>
          <br>
            <ul>
            <li>
            さらなる 並列処理向け I/O の動作を改善
            </li>
            <li>
            分散バージョン I/0 の設計と実装
            </li>
            <li>
            I/O を利用した、マルチコアソフトウェアシンセサイザーを設計
            </li>
            </ul>

      </article>


  </body>
</html>