ファイルを「ギャップ」のある配列に読み込む方法を見つけようとしています。
したがって、読み取りデータはバイト配列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 ミリ秒かかります。
大きな不一致は少し奇妙に思えますが、正しいハッシュが生成されます。