clang 11.0.0版
example.c:
#define ARRAYSIZE 1024
int a[ARRAYSIZE];
int b[ARRAYSIZE];
int c[ARRAYSIZE];
void subtract_arrays(int *restrict a, int *restrict b, int *restrict c)
{
for (int i = 0; i < ARRAYSIZE; i++)
{
a[i] = b[i] - c[i];
}
}
int main()
{
subtract_arrays(a, b, c);
}命令:
clang --target=aarch64-linux-gnu -march=armv8-a+sve -O3 -S example.cLLVM总是生成霓虹灯向量,但我希望它生成SVE向量。我该怎么做呢?
发布于 2021-02-09 20:02:06
不幸的是,Clang version11不支持自动矢量化。
这将随LLVM13一起提供:Architecture support in LLVM
但是,您可以使用内部函数或内联程序集生成SVE代码。你的带有内部函数的代码看起来像这样:
#include <arm_sve.h>
void subtract_arrays(int *restrict a, int *restrict b, int *restrict c) {
int i = 0;
svbool_t pg = svwhilelt_b32(i, ARRAYSIZE);
do
{
svint32_t db_vec = svld1(pg, &b[i]);
svint32_t dc_vec = svld1(pg, &c[i]);
svint32_t da_vec = svsub_z(pg, db_vec, dc_vec);
svst1(pg, &a[i], da_vec);
i += svcntw();
pg = svwhilelt_b32(i, ARRAYSIZE);
}
while (svptest_any(svptrue_b32(), pg));
}我也有类似的问题,认为SVE自动矢量化是受支持的。当使用Clang定位SVE时,优化报告显示了成功的矢量化,尽管只对Neon进行了矢量化。
https://stackoverflow.com/questions/65605803
复制相似问题