读取目标数组中带有"gaps"的文件

Reading file with "gaps" in destination array

本文关键字:gaps 文件 目标 数组 读取      更新时间:2023-10-16

我正试图找到一种方法,将文件读取到具有"间隙"的数组中:
因此,读取的数据在字节阵列buffer中的位置buffer[0], buffer[2], .., buffer[2*i]处,没有任何显著的速度损失。

更具体地说,我想按整数(即b[0], b[4], ..., b[i * 4])来阅读它。

这在任何方面都可能吗(C#,C++),或者我应该寻找另一种方法吗?

更多背景:
我正在尝试加快哈希算法(按块对文件进行哈希处理,插入块哈希,对其进行哈希处理并获取生成的哈希)
这个想法是"并行"执行SSE3和4个块,这就是为什么我需要这样的数据,这样我就可以很容易地将数据加载到寄存器中。

我用C++编写的(pinvoable)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,作为方法参数传递
buffer是由我的C++代码分配的uint32_t*指针。

问题是它花费的时间太长了。调用上述代码4次大约需要90ms,而哈希需要3ms
这种巨大的差异让我觉得有点奇怪,但它产生了正确的散列。

在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;
   }