LLVM 中将数据从内存加载到 SIMD vector 的“正确”(即可移植)方式是什么?
查看 LLVM 的自动矢量化器为 x86 目标生成的典型 IR,模式似乎是:
double *
)的指针位转换为相应的 vector 类型(例如, <4 x double>*
),在 AVX 的情况下,这种模式很好地映射到 SIMD 内在函数,例如
_mm256_loadu_pd()
和 friend 。但是,我不知道这种策略是否也适用于其他 ISA(例如 Neon、AltiVec)。我无法在 LLVM 文档中找到有关该主题的信息。我错过了一些明显的东西吗?
最佳答案
花了更多时间思考这个问题后,我相信可移植解决方案可能如下:
insertelement
指示。 类似地,为了将 SIMD vector 中的值存储到内存位置,通过
extractelement
将 vector 元素提取为标量。指令并一一存储。在我的实验中,LLVM 优化器总是成功地识别这些模式并将它们融合到直接的 SIMD 加载/存储指令中。
然而,这种策略也会导致生成的 IR 大小显着膨胀,并导致编译时间下降。因此,目前我将坚持直接位播方法,如果位播方法在特定设置上失败,我可能会实现另一种方法作为后备。
关于c++ - LLVM 中的 SIMD vector 内存加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63090216/