[following question是相关的,但是答案很旧,并且来自用户Marc Glisse的评论表明,自C ++ 17以来,针对此问题有新的方法,可能没有充分讨论。
我正在尝试使对齐的内存对于SIMD正常工作,同时仍然可以访问所有数据。
在Intel上,如果我创建类型为__m256
的浮点向量,并将大小减小8倍,则会使内存对齐。
例如std::vector<__m256> mvec_a((N*M)/8);
以一种有点怪异的方式,我可以将指向矢量元素的指针强制转换为浮点数,这使我可以访问各个浮点值。
相反,我希望有一个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
的doesn't seem to be possible所有权。
我已经看到一些建议,我应该写一个custom allocator,但是这似乎需要很多工作,也许对于现代C ++,有更好的方法吗?
[标准C ++库中的所有容器,包括向量,都有一个可选的模板参数that specifies the container's allocator,要实现自己的容器并没有很多工作:
class my_awesome_allocator {
};
std::vector<float, my_awesome_allocator> awesomely_allocated_vector;
您将不得不编写一些实现分配器的代码,但是代码不会比您已经编写的多得多。如果您不需要C ++ 17之前的支持,则只需实现allocate()和deallocate()方法即可。