首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LLVM生成SVE向量

如何使用LLVM生成SVE向量
EN

Stack Overflow用户
提问于 2021-01-07 10:19:33
回答 1查看 61关注 0票数 0

clang 11.0.0版

example.c:

代码语言:javascript
复制
#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);
}

命令:

代码语言:javascript
复制
clang --target=aarch64-linux-gnu -march=armv8-a+sve -O3 -S example.c

LLVM总是生成霓虹灯向量,但我希望它生成SVE向量。我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2021-02-09 20:02:06

不幸的是,Clang version11不支持自动矢量化。

这将随LLVM13一起提供:Architecture support in LLVM

但是,您可以使用内部函数或内联程序集生成SVE代码。你的带有内部函数的代码看起来像这样:

代码语言:javascript
复制
#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进行了矢量化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65605803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档