如何在 RISC-V 汇编中使用向量运算

Posted

技术标签:

【中文标题】如何在 RISC-V 汇编中使用向量运算【英文标题】:How to use vector operations in RISC-V Assembly 【发布时间】:2019-02-01 11:04:00 【问题描述】:

我正在尝试利用 RISC-V 汇编中的向量操作,特别是我需要使用 arch RV64iV 或 RV64GV 编译我的源代码。 我正在使用 riscv64-unknown-elf- 工具链,具有以下参数:

riscv64-unknown-elf-gcc -o test -march=rv32iv test.s

但我收到以下错误:

汇编程序消息: 致命错误:-march=rv32iv:不支持的 ISA 子集 `v'

谢谢

【问题讨论】:

尝试更新您的工具链。 This post about RISC-V Vector Extensions from 2018 年 9 月表示 “目前还没有使用 GCC 进行实施工作或实验” @Michael:但这是否意味着没有自动矢量化或内在函数可以让 GCC 发出指令? GNU Binutils 是一个单独的项目,即使 gcc 从不发出它们,也可以实现 asm 指令。 (.s 上的gcc 只是将 asm 文件从 binutils 提供给 as-march 选项通常在仅组装而不是编译时毫无意义,但在 ARM 上对于拇指与 ARM 可能很重要......可能不是RISC-V) @PeterCordes:不知道。那是我能找到的信息。我最近没有自己构建 binutils,所以我没有任何最近的源代码分发。 我的评论在 OP 中得到了部分解决:他们应该尝试riscv64-unknown-elf-gcc test.s 并查看汇编程序说什么,而不是错误地输出 GCC 前端。 【参考方案1】:

截至 2019 年 2 月,没有标准的 RISC-V 矢量扩展,这意味着标准 RISC-V 工具链不支持。有各种各样的矢量扩展草案,但没有软件支持。

【讨论】:

【参考方案2】:

截至 2020 年初,RISC-V 矢量扩展“V”规范为 0.8 版,仍处于草案状态。

但是,有可用的 GNU gcc/binutils 的“V”端口,并且 Spike RISC-V 模拟器也支持“V”0.8。 README of the "V" spec links to the relevant branches。

我最近发表了 some notes 关于如何开始 RISC-V "V" 0.8 开发的文章,例如如何构建正确的工具链、相关组件、组装、编译“V”代码以及如何使用 Spike 对其进行测试。

【讨论】:

以上是关于如何在 RISC-V 汇编中使用向量运算的主要内容,如果未能解决你的问题,请参考以下文章

RISC-V 启动汇编异常定位

RISC-V 启动汇编异常定位

RISC-V 启动汇编异常定位

使用 SSE(IA32 汇编)执行简单的算术运算

Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

两个向量如何进行运算。