读取目标数组中带有“间隙”的文件

时间:2013-11-20 20:16:14

标签: c# c++ hash sse3

我正试图找到一种方法将文件读入带有“间隙”的数组:
因此,读取数据位于位置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 这个巨大的差异让我觉得有些奇怪,但它会产生正确的哈希值。

1 个答案:

答案 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;
   }