在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。
我正在尝试使对齐的内存对于SIMD正常工作,同时仍然可以访问所有数据。
在Intel上,如果创建类型为float的向量__m256
,并将大小减小8倍,则会使内存对齐。
例如 std::vector<__m256> mvec_a((N*M)/8);
以一种有点怪异的方式,我可以将指向矢量元素的指针强制转换为float,这使我可以访问各个float值。
取而代之的是,我希望具有一个std::vector<float>
正确对齐的,因此可以在__m256
不进行段错误的情况下加载到其他SIMD类型中。
我一直在研究aligned_alloc。
这可以给我一个正确对齐的C样式数组:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
但是我不确定如何执行此操作std::vector<float>
。赋予std::vector<float>
所有权marr_a
似乎是不可能的。
我已经看到一些建议,我应该编写一个自定义分配器,但这似乎需要大量工作,也许对于现代C ++,有更好的方法吗?
_mm256_loadu_ps(&vec[i])
。(但请注意使用默认的优化选项,GCC 分裂不保证对齐的256位加载/存储到vmovups XMM / vinsertf128。因此,有是一个优势,使用_mm256_load
过loadu
,如果你关心如何在GCC您的代码编译,如果有人忘了使用-mtune=...
或-march=
选项。)