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

标签 c++ c++17 stdvector simd memory-alignment

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/

相关文章:

c++ - 有没有办法创建由 `std::function<>` 包装的函数的哈希值?

c++ - 提取 __VA_ARGS__ 的第一个参数

C++ 17 : How to call a different constructor using if constexpr?

c++ - 在 OpenGL 中创建网格

C++ 新的 std::vector of pointers

c++ - gRPC 客户端流

c++ - return 语句是否为按值返回的函数创建一个临时对象?

c++ - 如何将用户输入的字符转换为 Double C++

c++ - 如果我需要读取大量文件,将任务分成多个线程会更快吗?

c++ - 如何从字符串中获取词 vector ?