 RISC-V 开放架构设计之道 1.0.0的图注包含更多细节。) 主循环是 DAXPY 计算的核心。地址 27 处的 AVX 指令 vmovapd 将 x 的 4 个 元素取到 ymm0 中。地址 2c 处的 AVX 指令 vfmadd213pd 将 a(ymm2)的 4 个副本 分别乘以 x 的 4 个元素(ymm0),再与 y 的 4 个元素(位于内存地址 ecx+edx*8 处) 相加,结果放入 ymm0。后续地址 32 处的 AVX 都需要复制一份。毫无疑问,许多代 SIMD ISA 新增了数百条 MIPS-32 和 x86-32 指 令,将来仍会出现数以百计的新指令。这种粗暴的 ISA 演进方式给汇编语言程序员带 来巨大的认知负担。像 vfmadd213pd 这样的指令,谁能记住其含义和使用场景? 相比之下,RV32V 代码不受向量寄存器堆大小的影响。若向量寄存器堆变大,不 仅 RV32V 本身无需改变,甚至无需重新编译程序。 处理器决定最大向量长度 0 Loop: 27: c5 fd 28 04 d3 vmovapd ymm0,[ebx+edx*8] # 取 x 的 4 个元素 2c: c4 e2 ed a8 04 d1 vfmadd213pd ymm0,ymm2,[ecx+edx*8] # 4 个乘加操作 32: c5 fd 29 04 d1 vmovapd [ecx+edx*8],ymm0 # 存 y 的 4 个元素 37: 830 码力 | 223 页 | 15.31 MB | 1 年前3 RISC-V 开放架构设计之道 1.0.0的图注包含更多细节。) 主循环是 DAXPY 计算的核心。地址 27 处的 AVX 指令 vmovapd 将 x 的 4 个 元素取到 ymm0 中。地址 2c 处的 AVX 指令 vfmadd213pd 将 a(ymm2)的 4 个副本 分别乘以 x 的 4 个元素(ymm0),再与 y 的 4 个元素(位于内存地址 ecx+edx*8 处) 相加,结果放入 ymm0。后续地址 32 处的 AVX 都需要复制一份。毫无疑问,许多代 SIMD ISA 新增了数百条 MIPS-32 和 x86-32 指 令,将来仍会出现数以百计的新指令。这种粗暴的 ISA 演进方式给汇编语言程序员带 来巨大的认知负担。像 vfmadd213pd 这样的指令,谁能记住其含义和使用场景? 相比之下,RV32V 代码不受向量寄存器堆大小的影响。若向量寄存器堆变大,不 仅 RV32V 本身无需改变,甚至无需重新编译程序。 处理器决定最大向量长度 0 Loop: 27: c5 fd 28 04 d3 vmovapd ymm0,[ebx+edx*8] # 取 x 的 4 个元素 2c: c4 e2 ed a8 04 d1 vfmadd213pd ymm0,ymm2,[ecx+edx*8] # 4 个乘加操作 32: c5 fd 29 04 d1 vmovapd [ecx+edx*8],ymm0 # 存 y 的 4 个元素 37: 830 码力 | 223 页 | 15.31 MB | 1 年前3
 The RISC-V Reader:
An Open Architecture AtlasFirst Edition, 1.0.0 - 2021순환문은 DAXPY 계산의 심장부이다. 27번지에 있는 AVX 명령어 vmovapd는 x 에 있는 4개 요소를 ymm0에 적재한다. 2c번지에 있는 AVX 명령어 vfmadd213pd는 a의 네 개 복사본(ymm2)과 x의 네 요소와 곱하고, y의 네 요소(ecxO+edx*8 번지에 있는 메모 리에서)를 더하고, 그리고 네 개의 합을 ymm0에 넣는다. 32번지에 미래에도 수 백개가 또 다시 생성될 것이다. ISA 진화에 따라 이런 마구잡이식 접근 방법으로는 어셈블리어 프로그래 머에게는 엄청난 부담이 될 수 밖에 없다. vfmadd213pd가 무엇을 의미하고 언제 그것을 사용하는지 어떻게 기억하겠는가? 비교해 본다면 RV32V 코드는 벡터 레지스터를 위한 메모리의 크기에 영향을 받지 않는다. 벡터 메모리 크기가 Loop: 27: c5 fd 28 04 d3 vmovapd ymm0,[ebx+edx*8] # load 4 elements of x 2c: c4 e2 ed a8 04 d1 vfmadd213pd ymm0,ymm2,[ecx+edx*8] # 4 mul adds 32: c5 fd 29 04 d1 vmovapd [ecx+edx*8],ymm0 # store into 4 elements0 码力 | 232 页 | 5.16 MB | 1 年前3 The RISC-V Reader:
An Open Architecture AtlasFirst Edition, 1.0.0 - 2021순환문은 DAXPY 계산의 심장부이다. 27번지에 있는 AVX 명령어 vmovapd는 x 에 있는 4개 요소를 ymm0에 적재한다. 2c번지에 있는 AVX 명령어 vfmadd213pd는 a의 네 개 복사본(ymm2)과 x의 네 요소와 곱하고, y의 네 요소(ecxO+edx*8 번지에 있는 메모 리에서)를 더하고, 그리고 네 개의 합을 ymm0에 넣는다. 32번지에 미래에도 수 백개가 또 다시 생성될 것이다. ISA 진화에 따라 이런 마구잡이식 접근 방법으로는 어셈블리어 프로그래 머에게는 엄청난 부담이 될 수 밖에 없다. vfmadd213pd가 무엇을 의미하고 언제 그것을 사용하는지 어떻게 기억하겠는가? 비교해 본다면 RV32V 코드는 벡터 레지스터를 위한 메모리의 크기에 영향을 받지 않는다. 벡터 메모리 크기가 Loop: 27: c5 fd 28 04 d3 vmovapd ymm0,[ebx+edx*8] # load 4 elements of x 2c: c4 e2 ed a8 04 d1 vfmadd213pd ymm0,ymm2,[ecx+edx*8] # 4 mul adds 32: c5 fd 29 04 d1 vmovapd [ecx+edx*8],ymm0 # store into 4 elements0 码力 | 232 页 | 5.16 MB | 1 年前3
 RISC-V 手册 v2(一本开源指令集的指南)的标题中有更详细的解释) 主循环是 DAXPY 计算的核心。地址 27 处的 AVX 指令 vmovapd 将 x 的 4 个元素 load 到 ymm0 中。地址 2c 处的 AVX 指令 vfmadd213pd 将 a(ymm2)乘以 x(ymm0) 的 4 个元素的 4 个副本,加上 y 的四个元素(在内存中地址为 ecx+edx*8 处),并将 4 个和 放入 ymm0。接下来地址 32 处的 AVX 的传承中一共创造了数 百条 MIPS-32 和 x86-32 指令,而且将来还会有数以百计的新指令出现。汇编语言程序员一 定因这种粗暴的 ISA 演变方式而承担了难以承受的认知负担。像 vfmadd213pd 这样的指 令,谁能记住它的含义并知道什么时候要用它? 相比之下,RV32V 代码不受向量寄存器的可用存储空间的大小影响。如果向量内存变 大,不仅 RV32V 不会改变,而且你甚至不用重新编译。处理器提供了最大向量长度0 码力 | 164 页 | 8.85 MB | 1 年前3 RISC-V 手册 v2(一本开源指令集的指南)的标题中有更详细的解释) 主循环是 DAXPY 计算的核心。地址 27 处的 AVX 指令 vmovapd 将 x 的 4 个元素 load 到 ymm0 中。地址 2c 处的 AVX 指令 vfmadd213pd 将 a(ymm2)乘以 x(ymm0) 的 4 个元素的 4 个副本,加上 y 的四个元素(在内存中地址为 ecx+edx*8 处),并将 4 个和 放入 ymm0。接下来地址 32 处的 AVX 的传承中一共创造了数 百条 MIPS-32 和 x86-32 指令,而且将来还会有数以百计的新指令出现。汇编语言程序员一 定因这种粗暴的 ISA 演变方式而承担了难以承受的认知负担。像 vfmadd213pd 这样的指 令,谁能记住它的含义并知道什么时候要用它? 相比之下,RV32V 代码不受向量寄存器的可用存储空间的大小影响。如果向量内存变 大,不仅 RV32V 不会改变,而且你甚至不用重新编译。处理器提供了最大向量长度0 码力 | 164 页 | 8.85 MB | 1 年前3
共 3 条
- 1













