changeset 78:853969608995

fix
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Wed, 17 Feb 2016 21:12:59 +0900
parents 4947e0eed9d8
children 7037f6e34895
files paper/c4.tex paper/master_paper.pdf
diffstat 2 files changed, 65 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/paper/c4.tex	Wed Feb 17 21:01:02 2016 +0900
+++ b/paper/c4.tex	Wed Feb 17 21:12:59 2016 +0900
@@ -20,14 +20,77 @@
   \label{fig:dividefile}
 \end{figure}
 
-\newpage
 ファイルを読み込んで文字列処理をする流れを1つのクラスとして Cerium 内に組み込んだ。
 Cerium で文字列処理の並列処理を記述する際にこのクラスを利用すれば、
 自動的にファイルをある程度のサイズに分割し、文字列処理の Task と結果を表示する Print Task の依存関係も設定される。
 このクラスは、ファイルをマッピングし処理をすることで小さいデータの集合を出力することから FileMapReduce と名付けた。
 
-FileMapReduce の例題として \ref{sec:wc}章の Word Count 内で紹介する。
+Cerium のプログラムを記述する際には TMmain が C でいう main 関数となる。TMmain 関数内に Task の生成や依存関係を設定する。
 FileMapReduce のコンストラクタを生成すると、ファイルの分割や文字列処理の Task と Print Task の依存関係を設定してくれる。
+\begin{lstlisting}[frame=lrbt,label=src:TMmain,caption=FileMapReduce による Word Count の生成,numbers=left]
+int
+TMmain(TaskManager *manager, int argc, char *argv[])
+{
+    char *filename = 0;
+    FileMapReduce *fmp = new FileMapReduce(manager,TASK_EXEC,TASK_EXEC_DATA_PARALLEL,TASK_PRINT);
+    filename = fmp->init(argc, argv);
+    if (filename < 0) {
+        return -1;
+    }
+    /*
+     * 文字列処理後に出力されるデータの数を設定する。
+     */
+    fmp->division_out_size = sizeof(unsigned long long)*4;
+    task_init();
+    fmp->run_start(manager, filename);
+    return 0;
+}
+\end{lstlisting}
+
+\begin{lstlisting}[frame=lrbt,label=src:Exec,caption=文字列処理の記述,numbers=left]
+static int
+exec(SchedTask *s, void *rbuf, void *wbuf)
+{
+    // Input Data の設定(FileMapReduceにより自動的に生成される)
+    long task_spwaned = (long)s->get_param(0);
+    long division_size = (long)s->get_param(1);
+    long length = (long)s->get_param(2);
+    long out_size = (long)s->get_param(3);
+    long allocation = task_spwaned + (long)s->x;
+    char* i_data;
+    unsigned long long* o_data;
+    if (division_size) {
+        i_data = (char*)s->get_input(rbuf,0) + allocation*division_size;
+        o_data = (unsigned long long*)s->get_output(wbuf,1) + allocation*out_size;
+    } else {
+        i_data = (char*)s->get_input(0);
+        o_data = (unsigned long long*)s->get_output(0);
+    }
+
+    // 文字列処理をここに記述する。
+
+    // Output Data の設定
+    o_data[0] = (unsigned long long)word_num;
+    o_data[1] = (unsigned long long)line_num;
+    return 0;
+}
+\end{lstlisting}
+
+\begin{lstlisting}[frame=lrbt,label=src:Print,caption=結果を集計する Print ルーチン,numbers=left]
+static int
+run_print(SchedTask *s, void *rbuf, void *wbuf)
+{
+    MapReduce *w = (MapReduce*)s->get_input(0);
+    unsigned long long *idata = w->o_data;
+    int out_task_num = w->task_num;
+
+    // 結果の整合性や print などをここに記述する。
+
+    s->printf("\n");
+    return 0;
+}
+\end{lstlisting}
+
 
 
 ファイルを分割して文字列処理を行なった際、分割された部分でそれぞれの例題の整合性が取れなくなってしまうことがある。
Binary file paper/master_paper.pdf has changed