view 14/February/memo/03rd.txt @ 51:d8f499590d82

rename 201* to 1*
author Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
date Sun, 16 Mar 2014 13:36:04 +0900
parents 2014/February/memo/03rd.txt@37d843c14923
children
line wrap: on
line source

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 以上の数値を突っ込んでいたので、オーバーフローしていた