动态分配 SIMD 向量数组是否安全?

问题描述

在普通 C++ 中,我们可以使用标准库函数 mallocnew 关键字动态分配浮点数组。 当我们想到 SIMD 向量时,它们是像 float32x4_t 这样的编译器扩展(对于 ARM neon),动态分配这样的 SIMD 向量数组是否安全:

uint32_t number_req = 32; 
float32x4_t *simd_arr = (float32x4_t *)malloc(sizeof(float32x4_t) * number_req); 

我正在尝试限制代码中加载存储指令的数量。 如果以上不是合法的方法,那么实现它的正确方法是什么? 每一个帮助将不胜感激! 非常感谢您提前!

解决方法

我正在尝试限制代码中加载存储指令的数量。

以这种方式减少代码中加载/存储内部函数的数量无济于事。

取消引用 float32x4_t* 完全等同于加载或存储内部函数,实际上可能是如何实现 1 向量对齐加载内部函数的。

何时可以将向量类型保存在向量寄存器中取决于编译器,就像将 int 对象保存在普通整数寄存器中一样。

加载/存储内部函数主要用于与编译器通信对齐,并使其对类型感到满意;查看编译器生成的 asm 以了解实际情况。

,

您可能需要 aligned_alloc,它是在 C11 中引入的,用于替代此类情况的 malloc

,

或在所有 Linux libc 库中都可用的 memalign()