# HG changeset patch # User Masataka Kohagura # Date 1455711179 -32400 # Node ID 853969608995991348d55c112a38094539eca14f # Parent 4947e0eed9d8723f3ce73ee37929fd61172d8cdb fix diff -r 4947e0eed9d8 -r 853969608995 paper/c4.tex --- 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} + ファイルを分割して文字列処理を行なった際、分割された部分でそれぞれの例題の整合性が取れなくなってしまうことがある。 diff -r 4947e0eed9d8 -r 853969608995 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed