changeset 9:91662ffcaf0b

finish??
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Sun, 20 Apr 2014 15:35:09 +0900
parents 24384cb335cf
children a110a807ac81
files paper/benchmark.tex paper/cerium.tex paper/conclusion.tex paper/io.tex
diffstat 4 files changed, 96 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/paper/benchmark.tex	Sun Apr 20 01:38:25 2014 +0900
+++ b/paper/benchmark.tex	Sun Apr 20 15:35:09 2014 +0900
@@ -1,6 +1,6 @@
 \section{Benchmark} \label{section:benchmark}
 
-例題で紹介した Word Count に Blocked Read を組み込み、1 GB のファイルを読み込み計測を行った。
+例題で紹介した Word Count に Blocked Read を組み込み、1 GB のファイルで計測を行った。
 
 実験環境
 \begin{itemize}
@@ -67,9 +67,15 @@
 
 読み込みを含めた場合の実験結果より、Blocked Read \& IO\_0 の実行速度が mmap と比較して 1.55 倍向上した。
 また、Blocked Read の CPU Type も SPE\_ANY から IO\_0 に変更することによって 1.36 倍向上した。
+% mmap だとそれぞれの WordCount の Task が実行されるときに、処理される範囲の読み込みが行われるので、I/O ネックでうまく並列に走ることができずに
+Blocked Read で WordCount Task と Read Task を分離させた。
+Blocked Read Task がファイル読み込みを行っている間も、WordCount Task は読み込んだ範囲に対して並列処理を行うことができた。
+その結果、mmap より速く WordCount 処理を行うことができたと考える。
 
 キャッシュに入った時は、mmap のほうが一括 Read と比較して 1.67 倍速くなる。そして、mmap と Blocked Read と mmap は、ほとんど同じ実行速度となった。
-\subsection{考察}
+
+
+%\subsection{考察}
 
 % mmap より Blocked Read で実装したほうが速くなったが、これは mmap の読み込み方法が問題であると考える。
 % 
--- a/paper/cerium.tex	Sun Apr 20 01:38:25 2014 +0900
+++ b/paper/cerium.tex	Sun Apr 20 15:35:09 2014 +0900
@@ -21,7 +21,9 @@
 
 input Data で格納して 2 つの数を乗算し、output data に格納する multiply という例題がある。
 その例題の Task 生成部分を以下に示す。
-\\
+
+\newpage
+
 \begin{verbatim}
 multi_init(TaskManager *manager)
 {
@@ -90,7 +92,6 @@
 \begin{tiny}
   \begin{table}[ht]
     \begin{center}
-      \caption{Task 側で使用する API}
       \label{table:taskAPI}
       \small
       \begin{tabular}[t]{c|l}
@@ -102,6 +103,7 @@
         get\_param & set\_param した値を取得 \\
         \hline
       \end{tabular}
+      \caption{Task 側で使用する API}
     \end{center}
   \end{table}
 \end{tiny}
--- a/paper/conclusion.tex	Sun Apr 20 01:38:25 2014 +0900
+++ b/paper/conclusion.tex	Sun Apr 20 15:35:09 2014 +0900
@@ -1,22 +1,22 @@
 \section{まとめと今後の課題}
 
-本研究では、I/Oを含む Task の並列処理の動作の改善を行った。
-ファイルを mmap でメモリを確保すると、文字列検索を行う Task が読み込みを行い、それが終了後に検索が行われる。
-読み込みが各 Task それぞれに割り当てられてしまうので、すべての Task が読み込み待ちとなってしまう。
-それを解決する方法として、読み込みを行う Task と文字列検索を行う Task を分けるように Blocked Read の設計と実装を行った。
+本研究では、I/Oを含む Task の並列処理の動作改善を行った。
+ファイルを mmap にて読み込むと、WordCount を行う Task がそれぞれ読み込みを行う。
 
-Blocked Read である程度の大きさを読み込んだら Task が順次起動するように実装したが、それだけだと順次読み込んでいる Blocked Read に Task が割り込まれてしまう。
-そのようなことが起こらないように、Cerium Task Manager に新しいデバイスの設定 IO\_0 というタイプを追加した。このデバイスは、他のデバイス設定よりも priority を高く設定しているので、このタイプ以外で起動する Task に割り込まれることが起こらなくなる。
+読み込みが各 Task それぞれに割り当てられてしまうので、すべての Task が読み込み待ちとなってしまう。
+それを解決する方法として、Read Task と文字列処理を行う Task を分けるように Blocked Read の設計と実装を行った。
 
-これらを実装した結果、本研究では mmap で実装したときよりも 36 \% の動作改善が見られた。
+Blocked Read である程度の大きさを読み込んだら Task が順次起動するように実装したのだが、それだけだと、順次読み込んでいる Blocked Read に Task が割り込まれてしまう。
+そのようなことが起こらないように、Cerium Task Manager に新しいデバイスの設定 IO\_0 というタイプを追加した。
+
+I/O が含まれるときの並列処理は、I/O のコントロールをプログラマが実装することで動作改善に繋がる。
 
 本来読み込みを行ったファイルは、一度プログラムを実行したあとでもキャッシュとしてメモリ上にテキストがそのまま残っている。
-キャッシュとは、使用頻度の高いデータを高速なデバイスに蓄えておくことによって読み込みのオーバーヘッドを少なくするための機能である。
-
+%キャッシュとは、使用頻度の高いデータを高速なデバイスに蓄えておくことによって読み込みのオーバーヘッドを少なくするための機能である。
 mmap で実装を行うと、同じファイルに対して複数回検索を行うときに 2回目以降のプログラムの処理は速くなる。
 それに対して、
 Blocked Read も 2回目以降の実行速度は mmap と同様に速くなるのだが、ある一定のファイルサイズを越えてしまうとキャッシュが無効となってしまう。
 10GB のファイルではそのようなことが発生することは確認しているが、どれくらいの大きさからキャッシュが無効になるのか不明である。
 
 キャッシュが無効になってしまうと、Blocked Read で実装した文字列検索は複数回実行するときに不利となる。
-なぜこのようなことが起こるのか調査して、それが起こらないように実装していきたい。
+なぜこのようなことが起こるのか調査して、それが起こらないように実装する必要がある。
--- a/paper/io.tex	Sun Apr 20 01:38:25 2014 +0900
+++ b/paper/io.tex	Sun Apr 20 15:35:09 2014 +0900
@@ -93,7 +93,8 @@
 それに対して、Blocked Readは、読み込み専用の Read Task と、処理専用の Task を別々に生成する。
 Read Task はファイル全体を一度に読み込むのではなく、ある程度の大きさで分割を行う。
 分割して読み込み終わったら、それぞれの Task が実行される。
-(図\ref{fig:block})
+%(図\ref{fig:block})
+(図4)
 Read Task が生成されて、その後 Task の生成となるので、Read Task は常に走っている必要がある。
 
 \begin{figure}[htbp]
@@ -122,13 +123,82 @@
 \label{fig:block}
 \end{figure}
 
-以下に、Blocked Read の実装を示す。
+\newpage
+
+以下に、Blocked Read Task の生成部分を示す。
+
+\begin{verbatim}
+
+HTaskPtr t_read =
+        manager->create_task(READ_TASK);
+t_read->set_cpu(DEVICE_TYPE);
+t_read->set_outData(0,
+        file_mmap + task_num * division_size,
+        task_blocks * division_size);
+t_read->set_param(0,fd);
+t_read->set_param(1,task_num*division_size);
+
+run_tasks(manager,w, task_blocks,・・・ );
+
+t_read->set_param(2,task_num*division_size);
+t_read->spawn();
+
+\end{verbatim}
+
+set\_cpu にて Read Task を担当するデバイスの設定を行う。
+set\_outData(0) にファイルを読み込んだときの格納場所を指定し、set\_param(0) にて読み込むファイルのファイルディスクリプタを設定している。
+set\_param(1) 、 set\_param(2) にて Blocked Read Task 単体で読み込むファイルの範囲の先頭と末尾のポジションを設定する。
+
+なお、run\_tasks 内部で、処理を行う task を生成している。
+その内部で、task が生成されるたびに task\_num をインクリメントを行っている。
+
+Blocked Read Task の記述は以下のようになる。
 
 \begin{verbatim}
-source hoge hoge
+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;
+}
 \end{verbatim}
 
-\newpage
+Blocked Read Task の生成部分で設定したパラメータをそれぞれ受け取る。ファイル読み込みの先頭と末尾のポジションが渡されているので、どれだけファイルを読みこめばいいか求めることができる。
+
+それらのパラメータを使用して、pread 関数に渡すことでファイル読み込みを実現している。
+
+\begin{tiny}
+  \begin{table}[ht]
+    \begin{center}
+      \label{table:pread}
+      \small
+        ssize\_t pread(int fd, void *buf, size\_t nbyte, off\_t offset);
+      \begin{tabular}[t]{c|l}
+        \hline
+        int fd & 読み込むファイルディスクリプタ \\
+        \hline
+        void *buf & 予め用意したバッファへの書き込み \\
+        \hline
+        size\_t nbyte & 読み込むサイズ \\
+        \hline
+        off\_t offset& ファイルの先頭からのオフセット \\
+        \hline
+      \end{tabular}
+      \caption{pread 関数の概要}
+    \end{center}
+  \end{table}
+\end{tiny}
 
 \subsection{I/O 専用 thread の実装}