2014/02/03 (Mon) [program] とりあえず、manager->allocate の内部実装を int -> long long に変更した。 regex_mas 2GB 以上の file を読み込ますと、mmap と divide read の違いで結果が違ってしまう。 -> 多分、ちゃんと読み込みされていないのでは?? grep -c "doing" 2g.txt -> 5209072 ./regex -file 2g.txt -sw doing -cpu 4 -> 5209072 ./regex -file 2g.txt -sw doing -cpu 4 -dr -> 5190577 ./regex -file 3g.txt -sw doing -cpu 4 -> 7799680 ./regex -file 3g.txt -sw doing -cpu 4 -dr -> 5190577 やっぱり 2GB の壁くさい segmentation fault が起こらないということは、ちゃんと allocate はされているっぽい。 ということは、やはり read 関係のどこかで 2GB 制限がかかってるのではないか。 (API を int -> long long にかえないといけない部分がまだ存在すると思われる。 divide read mode 時、wbuf の address の動きが怪しい long だと MAX が約2GB。つまりどこかで long long にしないとこれは直らない。 read_run 内の read->set_outData(0,w->file_mmap + w->read_task_number*w->read_division_size, w->read_division_size); 第二引数 の値がおかしくなっていることが発覚 実行結果 ---------------------- set_outData buf : 0x24367a000 w->file_mmap : 0x1c467a000 w->read_task_number : 127 w->read_division_size : 16777216 ---------------------- [read No 105 : wbuf addr 0x22d67a000] [read No 106 : wbuf addr 0x22e67a000] [read No 107 : wbuf addr 0x22f67a000] ・・・ [read No 120 : wbuf addr 0x23c67a000] [read No 121 : wbuf addr 0x23d67a000] ---------------------- set_outData buf : 0x14467a000 w->file_mmap : 0x1c467a000 w->read_task_number : 128 w->read_division_size : 16777216 ---------------------- ---------------------- set_outData buf : 0x14567a000 w->file_mmap : 0x1c467a000 w->read_task_number : 129 w->read_division_size : 16777216 ---------------------- 再実行 [read No 124 : wbuf addr 0x24067a000] [read No 125 : wbuf addr 0x24167a000] [read No 126 : wbuf addr 0x24267a000] [read No 127 : wbuf addr 0x24367a000] [read No 128 : wbuf addr 0x14467a000] [read No 129 : wbuf addr 0x14567a000] [read No 130 : wbuf addr 0x14667a000] 876543210 16^8 = 2^4^8 = 2^32 Address が 2^32 分落ちてしまっている。 (オーバーフローしている) 原因究明 (char*)w->file_mmap + (int)w->read_task_number*(int)w->read_division_size (int)w->read_task_number*(int)w->read_division_size int に 2GB 以上の数値を突っ込んでいたので、オーバーフローしていた