使std :: vector分配对齐内存的现代方法

问题描述 投票:3回答:1

[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_adoesn't seem to be possible所有权。

我已经看到一些建议,我应该写一个custom allocator,但是这似乎需要很多工作,也许对于现代C ++,有更好的方法吗?

c++ c++17 stdvector simd memory-alignment
1个回答
0
投票

[标准C ++库中的所有容器,包括向量,都有一个可选的模板参数that specifies the container's allocator,要实现自己的容器并没有很多工作:

class my_awesome_allocator {
};

std::vector<float, my_awesome_allocator> awesomely_allocated_vector;

您将不得不编写一些实现分配器的代码,但是代码不会比您已经编写的多得多。如果您不需要C ++ 17之前的支持,则只需实现allocate()deallocate()方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.