1

ファイルを「ギャップ」のある配列に読み込む方法を見つけようとしています。
したがって、読み取りデータはバイト配列bufferの位置buffer[0], buffer[2], .., buffer[2*i]にあり、速度が大幅に低下することはありません。

より具体的には、int 単位 (つまり ) で読みたいと思いb[0], b[4], ..., b[i * 4]ます。

それは何らかの方法で可能ですか (C#、C++)、または別のアプローチを探す必要がありますか?

もう少し背景:
私はハッシュアルゴリズムを高速化しようとしています(ファイルをブロックごとにハッシュし、ブロックハッシュを連結し、ハッシュし、結果のハッシュを取得します)。
アイデアは、SSE3 を使用して 4 つのブロックを「並列」で実行することでした。そのため、データをそのように必要とするため、データをレジスタに簡単にロードできます。

私が C++ で書いた (pinvokable) lib は良い結果 (つまり 4 倍の速さ) をもたらしますが、データを並べ替えると速度が低下します。

現在、ファイルをブロックごとに読み取ってから、int を並べ替えています (C#):

unsafe {
    uint* b = (uint*)buffer.ToPointer() + chunkIndex;
    fixed(byte* blockPtr = chunk) {
        uint* blockIntPtr = (uint*)blockPtr;

        for(int i = 0; i < 9500 * 1024 / 4; i += 4) {
            *(b + 00) = blockIntPtr[i + 0];
            *(b + 04) = blockIntPtr[i + 1];
            *(b + 08) = blockIntPtr[i + 2];
            *(b + 12) = blockIntPtr[i + 3];
            b += 16;
        }
    }
}

chunkはバイト配列でchunkIndexあり、int であり、メソッドのパラメーターとして渡されます。私のC++コードによって割り当てられ
bufferたポインタです。uint32_t*

これの問題は、時間がかかりすぎることです。上記のコードを 4 回呼び出すと、約 90 ミリ秒かかりますが、ハッシュには 3 ミリ秒かかります。
大きな不一致は少し奇妙に思えますが、正しいハッシュが生成されます。

4

1 に答える 1

0

C ++では、次のようにします:

uint* b = (uint*)buffer;
 for(int i = 0; i < 9500 * 1024; i ++) {
       //read 4 ints
            *(b+i+0)  = blockIntPtr[i + 0];
            *(b+i+1)  = blockIntPtr[i + 1];
            *(b+i+2)  = blockIntPtr[i + 2];
            *(b+i+3)  = blockIntPtr[i + 3];
      //skip next 12 ints
            b += 16;
   }
于 2013-11-20T21:48:02.520 に答える