【发布时间】:2021-06-21 02:01:04
【问题描述】:
在普通 C++ 中,我们可以使用标准库函数 malloc 或 new 关键字动态分配浮点数组。
当我们想到 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)是安全的,只要您不摆弄对齐。在 C++ 中,通常最好使用new表达式而不是malloc(),除非相关文档(例如,对于您的编译器,或者 - 在您的情况下 - ARM 开发指南)另有说明。这是否会影响加载和存储指令是您需要以另一种方式检查的内容(例如,通过编译器检查汇编器输出)。
标签: c++ arm simd intrinsics