Mercurial > hg > Papers > 2016 > masa-master
changeset 79:7037f6e34895
add source code bm and wc
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 17 Feb 2016 21:43:54 +0900 |
parents | 853969608995 |
children | fbdaf0c213fb |
files | paper/c4.tex paper/master_paper.pdf |
diffstat | 2 files changed, 67 insertions(+), 51 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/c4.tex Wed Feb 17 21:12:59 2016 +0900 +++ b/paper/c4.tex Wed Feb 17 21:43:54 2016 +0900 @@ -25,9 +25,11 @@ 自動的にファイルをある程度のサイズに分割し、文字列処理の Task と結果を表示する Print Task の依存関係も設定される。 このクラスは、ファイルをマッピングし処理をすることで小さいデータの集合を出力することから FileMapReduce と名付けた。 -Cerium のプログラムを記述する際には TMmain が C でいう main 関数となる。TMmain 関数内に Task の生成や依存関係を設定する。 -FileMapReduce のコンストラクタを生成すると、ファイルの分割や文字列処理の Task と Print Task の依存関係を設定してくれる。 -\begin{lstlisting}[frame=lrbt,label=src:TMmain,caption=FileMapReduce による Word Count の生成,numbers=left] +Cerium のプログラムを記述する際には TMmain 関数が C の main 関数に相当する。TMmain 関数内に Task の生成や依存関係を設定する。 +これまではファイルを分割して読み込む Task や文字列処理の Task を生成し、依存関係を設定するプログラムを記述していた。 +FileMapReduce を実装したことにより、FileMapReduce を呼び出すだけでそれらの設定を行うようになった。 + +\begin{lstlisting}[frame=lrbt,label=src:TMmain,caption=FileMapReduce を利用する際の TMmain の記述,numbers=left] int TMmain(TaskManager *manager, int argc, char *argv[]) { @@ -47,7 +49,7 @@ } \end{lstlisting} -\begin{lstlisting}[frame=lrbt,label=src:Exec,caption=文字列処理の記述,numbers=left] +\begin{lstlisting}[frame=lrbt,label=src:Exec,caption=文字列処理の記述部分,numbers=left] static int exec(SchedTask *s, void *rbuf, void *wbuf) { @@ -91,8 +93,6 @@ } \end{lstlisting} - - ファイルを分割して文字列処理を行なった際、分割された部分でそれぞれの例題の整合性が取れなくなってしまうことがある。 整合性の取り方についてはそれぞれの例題にて述べる。 @@ -143,21 +143,12 @@ 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; - } /* 文字列処理後に出力されるデータの数を設定する。 * Word Count では * 行数、単語数、ファイルの先頭に文字があるかどうかの flag、ファイルの末尾に文字があるかどうかの flag * の4つのデータが出力される。 */ fmp->division_out_size = sizeof(unsigned long long)*4; - task_init(); - fmp->run_start(manager, filename); - return 0; } \end{lstlisting} @@ -171,22 +162,6 @@ static int wordcount(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); - } - // Word Count のメインルーチン unsigned long long *head_tail_flag = o_data +2; int word_flag = 0; @@ -225,19 +200,12 @@ \begin{lstlisting}[frame=lrbt,label=src:Print,caption=結果を集計する Print ルーチン,numbers=left] #define STATUS_NUM 2 -SchedDefineTask1(Print,run_print); - static int run_print(SchedTask *s, void *rbuf, void *wbuf) { - MapReduce *w = (MapReduce*)s->get_input(0); - unsigned long long *idata = w->o_data; long status_num = STATUS_NUM; - int out_task_num = w->task_num; - unsigned long long word_data[STATUS_NUM]; int flag_cal_sum = 0; - s->printf("start sum\n"); for (int i = 0; i < STATUS_NUM; i++) { word_data[i] = 0; } @@ -254,11 +222,6 @@ } } word_data[0] += flag_cal_sum; - for (int i = status_num-1; i >=0; i--) { - s->printf("%llu ",word_data[i]); - } - s->printf("\n"); - return 0; } \end{lstlisting} @@ -277,7 +240,7 @@ \begin{figure}[htbp] \begin{center} -\includegraphics[width=0.7\textwidth]{images/example/bruteforth.pdf} +\includegraphics[width=0.5\textwidth]{images/example/bruteforth.pdf} \end{center} \caption{力まかせ法} \label{fig:bruteforth} @@ -296,14 +259,12 @@ \begin{figure}[htbp] \begin{center} -\includegraphics[width=0.7\textwidth]{images/example/bmsearchthink.pdf} +\includegraphics[width=0.5\textwidth]{images/example/bmsearchthink.pdf} \end{center} \caption{pattern に含まれていない文字で不一致になった場合} \label{fig:bmsearchthink} \end{figure} -\newpage - 図\ref{fig:bmsearchinclude} は不一致が起こったときの text の文字が pattern に含まれている場合である。 この場合は pattern を後ろに2つずらすと text と pattern が一致する。 @@ -312,14 +273,12 @@ \begin{figure}[htbp] \begin{center} -\includegraphics[width=0.7\textwidth]{images/example/bmsearchinlucde.pdf} +\includegraphics[width=0.5\textwidth]{images/example/bmsearchinlucde.pdf} \end{center} \caption{pattern に含まれている文字で不一致になった場合} \label{fig:bmsearchinclude} \end{figure} -\newpage - 図\ref{fig:bmsearchsame} は不一致が起こったときの text の文字が pattern に含まれ、その不一致文字が pattern に複数含まれている場合である。 pattern の長さは 4 で、不一致を起こした時の text の文字 `a' は pattern の 1 番目と 3 番目に含まれている。 @@ -328,7 +287,7 @@ \begin{figure}[htbp] \begin{center} -\includegraphics[width=0.7\textwidth]{images/example/bmsearchsame.pdf} +\includegraphics[width=0.5\textwidth]{images/example/bmsearchsame.pdf} \end{center} \caption{pattern に同じ文字が複数入り、その文字で不一致になった場合} \label{fig:bmsearchsame} @@ -354,6 +313,63 @@ \label{fig:iodivsuc} \end{figure} +\begin{lstlisting}[frame=lrbt,label=src:Print,caption=結果を集計する Print ルーチン,numbers=left] +typedef struct bm { + int* skip_table; + unsigned char *search_word; + int search_word_len; +} BM, *BMPtr; + +//Boyer Moore法に使用するテーブルを作成 +static void +create_BMskiptable(BMPtr bm) +{ + bm->skip_table = (int*)malloc(sizeof(int)*256); + for (int i = 0; i < 256; ++i) { + bm->skip_table[i] = bm->search_word_len; + } + + for (int j = 0; j < bm->search_word_len - 1; ++j) { + bm->skip_table[bm->search_word[j]] = bm->search_word_len - j - 1; + } +} + +int +TMmain(TaskManager *manager, int argc, char *argv[]) +{ + BMPtr bm = new BM; + bm->skip_table = (int*)malloc(sizeof(int)*256); + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i],"-sw") == 0) { + bm->search_word = (unsigned char*)argv[i+1]; i++; + bm->search_word_len = strlen((const char*)bm->search_word); + create_BMskiptable(bm); + } + } + fmp->w->global = (void*)bmp; + fmp->overrap = bmp->search_word_len - 1; + fmp->division_out_size = sizeof(unsigned long long); + task_init(); + fmp->run_start(manager, filename); + return 0; +} +\end{lstlisting} + +\begin{lstlisting}[frame=lrbt,label=src:Print,caption=結果を集計する Print ルーチン,numbers=left] +static int +print_task(SchedTask *s, void *rbuf, void *wbuf) +{ + MapReduce *w = (MapReduce*)s->get_input(0); + unsigned int idata_task_num = w->task_num; + int match_counter = 0; + + for (int i = 0;i < idata_task_num;i++) { + match_counter += idata[i]; + } + return 0; +} +\end{lstlisting} + \section{正規表現} 正規表現は文字列のパターンを表現するための方法である。