changeset 5:a96eeacc9d7b

add
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Tue, 17 Dec 2013 18:47:21 +0900
parents 3549c54cc7b7
children 89f82b09e32c
files Dec-2013/17th.html
diffstat 1 files changed, 178 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/Dec-2013/17th.html	Tue Dec 17 16:46:01 2013 +0900
+++ b/Dec-2013/17th.html	Tue Dec 17 18:47:21 2013 +0900
@@ -66,9 +66,23 @@
         <h3>
         今週のしたこと
         </h3>
-        <p>
-    ・検索文字列のハードコーディングの脱却<br>
-        </p>
+        <ul>
+
+        <li>
+        read関数によるfileの順次読み込み<br>
+        (読み込み部分をread()からpread()へ変更)
+        </li>
+
+        <li>
+        Read Taskのブロック化
+        (1つずつ起動していたものを、ブロック単位で起動するようにした)
+        </li>
+
+        <li>
+        MapReduce関数の整理
+        </li>
+
+        <ul>
     </article>
 
     <!--
@@ -93,88 +107,198 @@
 
     <article>
 
-    <h3>
-    main.cc:run_tasks内部(Taskへのデータ渡し)
-    </h3>
+    <h3> readからpreadへ</h3>
+    <p>変更前</p>
     <section><pre>
-Task *t_exec = 0;
+int *fd = (int *)s->get_input(rbuf,0);  ///ファイルディスクリプタの受取
+long readsize = (long)s->get_param(0);
+long task_number = (long)s->get_param(1);
 
-t_exec = task_array->next_task_array(TASK_EXEC,t_exec);
-t_exec->set_inData(0,w->file_mmap + a*w->division_size, size);
-<font color="red">t_exec->set_inData(1,w->search_word, w->search_word_len);</font>
-t_exec->set_inData(2,w->BMskip_table, 256);
+char text[(long)readsize];
+
+<font color="red">read(*fd,text,(long)readsize);</font>
+
+s->printf("[start task No. %d]\n",task_number);
+s->printf("%s\n",text);
 </pre></section>
 
-    <h3>
-    ppe/Exec.cc(Task内でのデータの受取)
-    </h3>
+    <p>変更後</p>
     <section><pre>
-unsigned char *i_data = (unsigned char *)s->get_input(rbuf,0);
-<font color="red">unsigned char *search_word = (unsigned char *)s->get_input(rbuf,1);</font>
-int *skip_table = (int *)s->get_input(2);
-
-s->printf("[in Exec search word = %p\n",search_word);
+<font color="red">pread(*fd, text, (long)read_size , division_size*task_number);</font>
 </pre></section>
 
 </article>
 
-    <article>
+    <article class='smaller'>
     <h3>
-    実行(アドレスの桁落ち(?)))
+    pread
     </h3>
+
     <section><pre>
-./regex -file c.txt -cpu 1 -sw doing
-in TMmain  search_word    = 0x7fba99c1a090
-in run start search_word    = 0x7fba99c1a090
-in run tasks w->search_word = 0x7fba99c1a090
-<font color="red">in Exec search word         =     0x99c1a090</font>
-zsh: segmentation fault  ./regex -file c.txt -cpu 1 -sw doing
+read(int fd, void *buf, size_t count);
+</pre></section>
+
+    <section><pre>
+pread(int fd, void *buf, size_t count, <font color="red">off_t offset</font>);
 </pre></section>
 
     <ul>
     <li>
-    search_word のアドレスが上の桁から落ちている。skip_table(intの配列)でもセグフォが発生するので、skip_tableももしかしたらアドレスが同じように落ちているんじゃ・・・
+    fd:ファイルディスクリプタ
+    </li>
+    <li>
+    buf:readするDataの格納領域
+    </li>
+    <li>
+    count:どれだけの量(byte)を読み込むか
+    </li>
+    <li>
+    offset:ファイルの先頭からどれだけの量(byte)を飛ばして読み込むのか
     </li>
     </ul>
+
+    <p>
+    read関数だと、Taskの起動する順番やタイミングによって同じ場所を読み込んだりしてしまう。read関数は読み込んだ後にファイルディスクリプタをずらしてしまうので、そのような現象が起こると考えられる。
+    </p>
+    <p>
+    pread関数だと、ファイルディスクリプタを動かさずにoffsetを取ることで読み込む場所が替えることができる。これだと、上記の現象が起こらずにすむ。
+    </p>
 </article>
 
 
     <article>
     <h3>
-    ppe/Exec.ccの修正
-    </h3>
-    <section><pre>
-unsigned char *i_data = <font color="red">(unsigned char *)s->get_inputAddr(0);</font>
-unsigned char *search_word = <font color="red">(unsigned char *)s->get_inputAddr(1);</font>
-int *skip_table = <font color="red">(int *)s->get_inputAddr(2);</font>
-
-s->printf("in Exec search_word : %p\n",search_word);
-    </pre></section>
-
-    <h3>
-    実行
+    readでの読み込みの失敗例
     </h3>
     <section><pre>
-./regex -file c.txt -cpu 1 -sw doing
-in run_tasks w->search_word Addr: 0x7f989b708280
-in Exec search_word Addr        : 0x7f989b708280
-HIT:27856
-Time: 0.042276
-</pre></section>
-    <li>
-    get_inputAddrだと正しくアドレスを受け渡しすることができた。
-    </li>
+% ./fileread -file d.txt
+filesize     : 16398
+one_task_size: 16384
+task_num     : 2
+[start task No. 0]
+firstaaaaaaaaaaaaaaaaaaaaaa...16380
+doin
+[start task No. 1]
+firstaaaaaaaaa
+    </pre></section>
+
+    <section><pre>
+[start task No. 0]
+gxbaaabaaabab
+[start task No. 1]
+gxbaaabaaabab
+    </pre></section>
 </article>
 
-    <article>
-    <h3>これからのすること</h3>
+    <article class='smaller'>
+    <h3>Read Taskのblock化</h3>
+    <p>変更前</p>
+    <section><pre>
+run_start(TaskManager *manager,char *filename)
+{
+    HTask *read;
+    int *fd = (int*)manager->allocate(sizeof(int));
+
+    if ((*fd=open(filename,O_RDONLY,0666))==0) {
+        fprintf(stderr,"can't open %s\n",filename); 
+    }
+        ...
+
+    for(int task_number = 0; task_number < task_num; task_number++){
+        read = manager->create_task(READ_TASK);
+        read->set_cpu(spe_cpu);
+
+        [task settings(省略)]
+
+    }
+}
+    </pre></section>
+    </article>
+
+    <article class='smaller'>
+    <p>変更後</p>
+    <section><pre>
+run_start(TaskManager *manager,char *filename)
+{
+    int *fd = (int*)manager->allocate(sizeof(int));
+
+    if ((*fd=open(filename,O_RDONLY,0666))==0) {
+        fprintf(stderr,"can't open %s\n",filename);
+    }
+
+    if (fstat(*fd,sb)) {
+        fprintf(stderr,"can't fstat %s\n",filename);
+    }
+        ...
+
+    FilereadPtr fr = (FilereadPtr)manager->allocate(sizeof(Fileread));
+
+    HTaskPtr run = manager->create_task(RUN_BLOCKS, (memaddr)&fr->self, sizeof(memaddr),0,0);
+    run->spawn();
+}
+    </pre></section>
+    </article>
+
+    <article class='smaller'>
+    <p>RUN_BLOCKS</p>
+    <section><pre>
+SchedDefineTask1(RUN_BLOCKS,run16);
+
+run16(SchedTask *manager, void *in, void *out) {
+
+    FilereadPtr fr = (FilereadPtr)in;
+    HTaskPtr wait;
+
+    for (int i = 0; (fr->left_size > 0) && (i < fr->task_blocks); i++) {
+        HTaskPtr read = manager->create_task(Read_task);
+        read->set_cpu(fr->cpu);
+
+        if (i == fr->task_blocks / 2) wait = read;
+
+        [task settings(省略)]
+
+    }
+    return 0;
+}
+    </pre></section>
+
     <ul>
     <li>
-    シンヤさんのRegenのソース読み&実装
+    Taskを1個1個起動ではなくブロック単位で起動している理由は、メモリの再利用のためである。
+1個1個起動すると、その分のメモリが必要となり、Task数が多くなると肥大化する。
+ブロック単位で起動することでメモリを節約するとともに、メモリの書き換えが少なくて済むので高速化につながる。
+    </li>
+    </ul>
+    </article>
+
+
+    <article class='smaller'>
+    <h3>Taskのブロック化の図(1)</h3>
+    <p>word countでの実装</p>
+    <p>
+    <div align="center">
+    <img src="images/old_run_task_blocks.jpg" width="40%" height="40%">
+    </div>
+    </p>
+    <ul>
+    <li>
+    run16がブロック単位でTaskを起動する。word countでは48 Task/1block。
     </li>
     <li>
-    並列I/Oの実装<br>
-    (例題:filereadにてI/Oの分割読み込みのプログラムを実装)
+    ブロック内の処理が全て終わらないと、新しいブロックを生成することができない。<br>
+    すべてのTaskが終わるまで待つので、オーバヘッドが起こる。
+    </li>
+    </ul>
+    </article>
+
+    <article class='smaller'>
+    <h3>Taskのブロック化の図(2)</h3>
+    <p>filereadでの実装</p>
+    <div align="center">
+    <img src="images/new_run_task_blocks.jpg" width="40%" height="40%">
+    </div>
+    <ul>
+    <li>
     </li>
     </ul>
     </article>