我正试图找到一种方法将文件读入带有“间隙”的数组:
因此,读取数据位于位置buffer
的字节数组buffer[0], buffer[2], .., buffer[2*i]
中,没有任何明显的速度损失。
更具体地说,我想逐字阅读(即b[0], b[4], ..., b[i * 4]
)。
这有可能吗(C#,C ++)还是我应该寻找另一种方法?
更多背景:
我正在尝试加速哈希算法(对文件进行块状哈希,联合阻塞,哈希,并获取结果哈希)。
想法是采用SSE3并在“并行”中执行4个块,这就是为什么我需要这样的数据,所以我可以轻松地将数据加载到寄存器中。
我用C ++编写的(pinvokable)lib提供了很好的结果(即快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次需要大约90ms,而散列需要3ms 这个巨大的差异让我觉得有些奇怪,但它会产生正确的哈希值。
答案 0 :(得分: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;
}