1

我正在尝试找到一种将文件读入具有“间隙”的数组的方法:因此读取的数据位于位置
的字节数组中,而没有任何明显的速度损失。bufferbuffer[0], buffer[2], .., buffer[2*i]

更具体地说,我想逐个阅读它(即b[0], b[4], ..., b[i * 4])。

这是否可能(C#、C++)或者我应该寻找另一种方法?

更多背景知识:
我正在尝试加速散列算法(按块对文件进行散列,连接块散列,对其进行散列,并获取结果散列)。
这个想法是/是采用 SSE3 并在“并行”中执行 4 个块,这就是我需要以这种方式获取数据的原因,因此我可以轻松地将数据加载到寄存器中。

我用 C++ 编写的 (pinvokable) 库提供了不错的结果(即快 4 倍),但重新排序数据会消耗速度增益。

目前我正在逐块读取文件,然后重新排序整数(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,作为方法参数传递。
bufferuint32_t*由我的 C++ 代码分配的指针。

这样做的问题是时间太长了。调用上述代码 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 回答