__m128i* pData = reinterpret_cast<__m128i*>(
_aligned_malloc(
128,
16));
std::vector<byte> sectorBytes = dataSet.GetSectorBytes(index);
index &= 0xfff;
memcpy(pData, §orBytes[index], 128);
正如您所看到的,我尝试将128字节从sectorBytes(无法保证16字节对齐)复制到pData中,这样做。不幸的是,在设置断点进行检查之后,我发现虽然sectorBytes正好具备我预期的,但pData [0]到pData [7]只包含零...所以实际上什么都没有被复制。
我不明白为什么没有被复制......为什么会这样?
当然,我尝试完成的较大任务是从指定偏移量的文件中获取128个字节,然后对它们执行_mm_xor_si128(),而不会因尝试执行simd操作而突然出现访问冲突数据不是16字节对齐的。为了促进讨论,这里是GetSectorBytes():
std::vector<byte> GetSectorBytes(
_In_ const uint32_t index) const throw()
{
std::vector<byte> buffer(0x1000);
int indexOuter = index & 0xfffff000;
_OVERLAPPED positionalData;
positionalData.Offset = indexOuter;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;
ReadFile(
hMappedFile,
&buffer[0],
0x1000,
NULL,
&positionalData);
return buffer;
}
hMappedFile是使用CreateFile2创建的,并设置了FILE_FLAG_NO_BUFFERING标志。