Cerium Task Manager
による正規表現の実装

Masataka Kohagura
10th December , 2013

研究目的

マルチコア CPU を最大限に活かすためには、並列プログラミングによる並列度を向上させなければならないが、実装が難しい。 当研究室では Cerium Libraryを提供することによって並列プログラミングを容易にしているが、ファイル読み込み等のI/O部分に関してはまだ実装されていない。

本研究ではその例題として正規表現を実装し、I/Oの並列化の設計・実装によって既存の正規表現の処理速度、処理効率を上げる。

今週のしたこと

・検索文字列のハードコーディングの脱却

main.cc:run_tasks内部(Taskへのデータ渡し)

Task *t_exec = 0;

t_exec = task_array->next_task_array(TASK_EXEC,t_exec);
t_exec->set_inData(0,w->file_mmap + a*w->division_size, size);
t_exec->set_inData(1,w->search_word, w->search_word_len);
t_exec->set_inData(2,w->BMskip_table, 256);

ppe/Exec.cc(Task内でのデータの受取)

unsigned char *i_data = (unsigned char *)s->get_input(rbuf,0);
unsigned char *search_word = (unsigned char *)s->get_input(rbuf,1);
int *skip_table = (int *)s->get_input(2);

s->printf("[in Exec search word = %p\n",search_word);

実行(アドレスの桁落ち(?)))

./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
in Exec search word         =     0x99c1a090
zsh: segmentation fault  ./regex -file c.txt -cpu 1 -sw doing

ppe/Exec.ccの修正

unsigned char *i_data = (unsigned char *)s->get_inputAddr(0);
unsigned char *search_word = (unsigned char *)s->get_inputAddr(1);
int *skip_table = (int *)s->get_inputAddr(2);

s->printf("in Exec search_word : %p\n",search_word);
    

実行

./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
  • get_inputAddrだと正しくアドレスを受け渡しすることができた。
  • これからのすること