# HG changeset patch # User Masataka Kohagura # Date 1392109896 -32400 # Node ID 9def91a908d66cea9a6213938b91ad9607a290f7 # Parent 54591c145fec898c16ea2257c6f4aae19f976e08 add diff -r 54591c145fec -r 9def91a908d6 slide/images/blockread.graffle --- 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 @@ MasterSheets ModificationDate - 2014-02-11 05:26:28 +0000 + 2014-02-11 08:18:18 +0000 Modifier MasaKoha NotesVisible @@ -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} +\f0\fs24 \cf0 Blocked Read Task 2} VerticalPad 0 @@ -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} +\f0\fs24 \cf0 Blocked Read} VerticalPad 0 @@ -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} +\f0\fs24 \cf0 Blocked Read Task 1} VerticalPad 0 @@ -4070,7 +4070,7 @@ WindowInfo CurrentSheet - 3 + 0 ExpandedCanvases Frame @@ -4088,7 +4088,7 @@ SidebarWidth 120 VisibleRegion - {{-53, 0}, {665.71428571428567, 422.28571428571428}} + {{0, 0}, {665.71428571428567, 422.28571428571428}} Zoom 1.75 ZoomValues diff -r 54591c145fec -r 9def91a908d6 slide/images/blockread.png Binary file slide/images/blockread.png has changed diff -r 54591c145fec -r 9def91a908d6 slide/index.html --- 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 が並列に動作するようにはされていない。

- 現状では、ファイルを全て memory に mapping を行ってから Task が走るようになっているので、非常に大きいサイズのファイルを読み込むと、ファイルを memory に mapping するまでの時間がオーバーヘッドになってしまう。 + 現状では、ファイルを memory に mapping を行ってから Task が走るようになっているので、I/O と Task が並列に動作しない。

本研究では I/O と Task が並列に動作するような設計、実装によってプログラム全体の - 処理速度を上げていく。 + 並列度、及び処理速度を上げていく。

+ +
+

mmapでの実装の問題点

+
    +
  • + mmap で file を読み込むと、file は memory 上にて即座には展開されない。 +
  • +
  • + file が memory に展開されるタイミングは、その file に対して何らかの計算を行うときである。

    + →つまり、Task が走るときに初めて memory に file を格納するので、I/O と Task が分離できない。 +
  • +
+
+ +

並列処理向け I/O の 設計と実装


  • I/O を含む Task の説明
  • -
  • mmap での実装
  • mmap の説明
  • -
  • Block Read の設計
  • -
  • Block Read の実装
  • +
  • Blocked Read の設計と実装
  • +
  • ベンチマーク
@@ -128,7 +99,7 @@
    -
  1. file mmaping 後、file をある一定の大きさに分割する
  2. +
  3. file mapping 後、file をある一定の大きさに分割する
  4. 分割した file に対して、それぞれ計算を行う
  5. 計算した結果を集計する
@@ -136,31 +107,6 @@
-

mmap での I/O の実装

-
-

mmap の記述

-
-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);
-}
-
-
    -
  • - PROT_READ : 読み込み可 -
  • -
  • - MAP_PRIVATE : 読み込んだ領域に対して書き込みが起こると複製し、複製した領域に対して書き込みを行う -
  • -
-
- -

mmap の説明

@@ -193,7 +139,7 @@
-

Block Read の設計

+

Blocked Read の設計



@@ -206,9 +152,6 @@ 先読みを自分で書ける(制御できる)
  • - code が煩雑 -
  • -
  • memory より大きなファイルを扱える
  • @@ -253,38 +196,8 @@
    --> - -
    -

    Block Read の実装(1/3)

    -
    -

    Block Read の実装

    -
    -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();
    -
    -
    -
    - -
    -

    Block Read の実装(2/3)

    +

    Blocked Read の実装



    @@ -297,38 +210,17 @@
  • Task 1つ当たりの読み込む領域を L とする。
    - Block Read Task 1つ当たり、memory に格納する大きさは L × n となる。 + Blocked Read Task 1つ当たり、memory に格納する大きさは L × n となる。
  • - Block Read Task が読み込み終わるまで、Task Block に wait を掛ける。
    + Blocked Read Task が読み込み終わるまで、Task Block に wait を掛ける。
    (Read Task が格納する前に走ると、まだ格納していない領域を読みこんでしまう。)
  • -
    -

    Block Read の実装(3/3)

    -
    -

    Block Read の記述

    -
    -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;
    -}
    -
    -
    - -
    -

    ベンチマーク(1/)

    +

    ベンチマーク(1/3)


    実験環境

      @@ -345,10 +237,18 @@
    -

    ベンチマーク(2/)

    -

    - file が memory に残っていない状態での測定 -

    +

    ベンチマーク(2/3)

    +
      +
    • + file が memory に残っていない状態での測定 +
    • +
    • + one task size 128KByte +
    • +
    • + Task Blocks 48 +
    • +

    結果

    @@ -356,8 +256,6 @@ - - @@ -365,8 +263,6 @@ - - @@ -374,8 +270,6 @@ - - @@ -384,8 +278,6 @@ - - @@ -393,8 +285,6 @@ - - @@ -402,8 +292,22 @@
    read mode cpu numone task sizetask blocks min time(s) MAX time(s) ave time(s)
    mmap 4128kbyte48 135.2 148.9 142.3
    BRead 4128kbyte48 94.5 109.2 98.8
    mmap 12128kbyte48 147.0 181.8 154.6
    BRead 12128kbyte48 91.6 117.5 99.2
    +
    +
    +

    ベンチマーク(3/3)

    考察

    +
      +
    • + mmap より、Blocked Readのほうが % ほど速くなった +
    • +
    • + I/O と Task が分離できた。 +
    • +
    • +
    • +
    +
    @@ -414,15 +318,36 @@ さらなる 並列処理向け I/O の動作を改善
  • - 分散バージョン I/0 の設計と実装 -
  • -
  • I/O を利用した、マルチコアソフトウェアシンセサイザーを設計
  • +
    +

    マルチコアソフトウェアシンセサイザーの設計

    +
    +
      +
    • + 作曲をする際にはマシンパワーが必要となることが多い。 +
    • +
    • + ソフトウェアシンセサイザー(以下、シンセサイザー)を使用する際にマシンパワーが必要となる。 +
    • +
    • + シンセサイザーは1つだけで立ち上げる物ではなく、複数立ち上げる物なので、1つ1つの負荷を抑えることがキーポイントとなる。 +
    • +
    • + シンセサイザーは様々なフィルターをかけることで音を作っていくのだが、フィルターを重ねても動作軽量なプログラムを作る。 +
    • +
    +
    + + + + + +