following question是相关的,但是答案很旧,来自用户的评论 Marc Glisse表明自 C++17 以来有可能没有充分讨论的新方法来解决这个问题。
我试图让对齐的内存为 SIMD 正常工作,同时仍然可以访问所有数据。
在 Intel 上,如果我创建一个类型为 __m256
的浮点 vector ,并将我的大小减少 8 倍,它为我提供了对齐的内存。
例如std::vector<__m256> mvec_a((N*M)/8);
以一种稍微有点麻烦的方式,我可以将指向 vector 元素的指针转换为浮点,这允许我访问单个浮点值。
相反,我更愿意拥有一个 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++ 库中的所有容器,包括 vector ,都有一个可选的模板参数 that specifies the container's allocator ,并且实现自己的工作并不是很多工作:
class my_awesome_allocator {
};
std::vector<float, my_awesome_allocator> awesomely_allocated_vector;
您将不得不编写一些代码来实现您的分配器,但这不会比您已经编写的代码多得多。如果您不需要 C++17 之前的支持,您只需要实现 allocate()和 deallocate()方法,就是这样。
关于c++ - 使 std::vector 分配对齐内存的现代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60169819/