我正在尝试找到一种将文件读入具有“间隙”的数组的方法:因此读取的数据位于位置
的字节数组中,而没有任何明显的速度损失。buffer
buffer[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,作为方法参数传递。
buffer
是uint32_t*
由我的 C++ 代码分配的指针。
这样做的问题是时间太长了。调用上述代码 4 次大约需要 90 毫秒,而散列需要 3 毫秒。
巨大的差异让我觉得有点奇怪,但它会产生正确的哈希值。