From: Jie Liu liujie375@h-partners.com
Signed-off-by: He Huang huanghe73@h-partners.com Signed-off-by: Jie Liu liujie375@h-partners.com --- .../Wayca-Kunpeng-高性能调度/README.md | 28 ++--- ...Kunpeng-高性能调度-CPU特性介绍.md | 110 ++++++++++++++++++ ...��能调度-xxx技术用户使用指南.md | 25 ---- ...g-高性能调度-xxx模块特性介绍.md | 21 ---- 4 files changed, 125 insertions(+), 59 deletions(-) create mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-CPU特性介绍.md delete mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx技术用户使用指南.md delete mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx模块特性介绍.md
diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/README.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/README.md index d5e6b3e..020db8c 100644 --- a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/README.md +++ b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/README.md @@ -1,23 +1,25 @@ - # openEuler WayCa 鲲鹏 高性能调度
## 高性能调度
-- 鲲鹏高速网络主要使用鲲鹏硬件xxx模块, 主要应用涉及xxx技术和xxx等。 -本文档提供了鲲鹏xx特性的基本使用和模块的特性介绍,具体内容详见如下: +本文档提供了鲲鹏高性能调度CPU特性的介绍和基本使用,具体内容详见如下: + +### CPU特性介绍 + +- Wayca-Kunpeng-高性能调度-CPU特性介绍.md +- https://gitee.com/openeuler/WayCa
-## xxx 技术文档 +### BTI用户使用指南
-- WayCa-Kunpeng-xxx-xxx技术用户使用指南.md -- https://gitee.com/openeuler/xxx/wayca-Kunpeng-xxx/xx%E6%96%87%E6%A1%A3 +- Wayca-Kunpeng-高性能调度-BTI用户使用指南.md +- https://gitee.com/openeuler/WayCa
-- WayCa-Kunpeng-xxxx-xxx模块特性介绍.md -- https://gitee.com/openeuler/xxx/wayca-Kunpeng-xxx/xx%E6%96%87%E6%A1%A3 +### SVE用户使用指南
-## xxx 技术文档 +- Wayca-Kunpeng-高性能调度-SVE用户使用指南.md +- https://gitee.com/openeuler/WayCa
-- WayCa-Kunpeng-xxxx-xxx技术用户使用指南.md -- https://gitee.com/openeuler/xxx/wayca-Kunpeng-xxxx/xx%E6%96%87%E6%A1%A3 +### AMU用户使用指南
-- WayCa-Kunpeng-xxxx-xxx模块特性介绍.md -- https://gitee.com/openeuler/xxx/wayca-Kunpeng-xxxx/xx%E6%96%87%E6%A1%A3 \ No newline at end of file +- Wayca-Kunpeng-高性能调度-AMU用户使用指南.md +- https://gitee.com/openeuler/WayCa diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-CPU特性介绍.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-CPU特性介绍.md new file mode 100644 index 0000000..4e6221c --- /dev/null +++ b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-CPU特性介绍.md @@ -0,0 +1,110 @@ +# Wayca-Kunpeng-高性能调度-CPU特性介绍 + +## 特性详解 + +### 特性1:SVE(Scalable Vector Extension)可扩展矢量扩展 + +- 特性详解 + +随着 Neon 架构扩展(其指令集具有固定的 128 位向量长度)的开发,Arm 设计了可扩展向量扩展 (SVE) 作为 AArch64 的下一代 SIMD 扩展。SVE引入可扩展概念, 允许灵活的向量长度实现,使其能够在现在或将来的多应用场景下实现伸缩,允许CPU设计者自由选择向量的长度来实现。矢量长度可以从最小 128 位到最大 2048 位不等,以 128 位为增量。在当前实现中,最大实现向量长度为256位。 + +- 源码仓库: https://gitee.com/openeuler/kernel/ +- 特性代码: arch/arm64/kernel +- 支持版本: openEuler 22.03 lts、openEuler 22.03 lts sp1 +- 回合的关键patches: + +| COMMITID | SUBJECT |openeuler OLK-5.10 enabled(Y/N)| +| ---------- | ---------- | -----------| +| 27e64b4be4b8 | regset: Add support for dynamically sized regsets |Y| +| 94ef7ecbdf6f | arm64: fpsimd: Correctly annotate exception helpers called from asm | Y | +| abf73988a7c2| arm64: signal: Verify extra data is user-readable in sys_rt_sigreturn |Y| +| 93390c0a1b20| arm64: KVM: Hide unsupported AArch64 CPU features from guests |Y| +| b472db6cf8c6 | arm64: efi: Add missing Kconfig dependency on KERNEL_MODE_NEON|Y| +| 38b9aeb32fa7| arm64: Port deprecated instruction emulation to new sysctl interface |Y| +| 9cf5b54fafed| arm64: fpsimd: Simplify uses of {set, clear}_ti_thread_flag()|Y| +| 672365649cca |arm64/sve: System register and exception syndrome definitions |Y| +| 1fc5dce78ad1| arm64/sve: Low-level SVE architectural state manipulation functions |Y| +| ddd25ad1fde8| arm64/sve: Kconfig update and conditional compilation support |Y| +| d0b8cd318788| arm64/sve: Signal frame and context structure definition |Y| +| 22043a3c082a | arm64/sve: Low-level CPU setup |Y| +| bc0ee4760364 | arm64/sve: Core task context handling|Y| +| 79ab007c75d6| arm64/sve: Support vector length resetting for new processes |Y| +| 8cd969d28fd2 | arm64/sve: Signal handling support |Y| +| 7582e22038a2| arm64/sve: Backend logic for setting the vector length |Y| +| 8f1eec57cdcc | arm64: cpufeature: Move sys_caps_initialised declarations |Y| +| 2e0f2478ea37 | arm64/sve: Probe SVE capabilities and usable vector lengths |Y| +| 1bd3f93641ec| arm64/sve: Preserve SVE registers around kernel-mode NEON use |Y| +| fdfa976cae5c | arm64/sve: Preserve SVE registers around EFI runtime service calls |Y| +| 43d4da2c45b2 | arm64/sve: ptrace and ELF coredump support |Y| +| 2d2123bc7c7f | rm64/sve: Add prctl controls for userspace vector length management |Y| +| 4ffa09a939ab| arm64/sve: Add sysctl to set the default vector length for new processes|Y| +| 17eed27b02da | arm64/sve: KVM: Prevent guests from using SVE |Y| +| aac45ffd1f8e | arm64/sve: KVM: Treat guest SVE use as undefined instruction execution |Y| +| 07d79fe7c223 | arm64/sve: KVM: Hide SVE from CPU features exposed to guests |Y| +| 43994d824e84 | arm64/sve: Detect SVE and activate runtime support |Y| +| ce6990813f15 | arm64/sve: Add documentation |Y| +| 94b07c1f8c39| arm64: signal: Report signal frame size to userspace via auxv |Y| + +### 特性2:BTI(Branch Target Identification)分支目标识别 + +- 特性详解 + +BTI(branch target identification)是其中一种方法,这个功能是用来捕捉wild jump(野跳转)的。理念很简单:打开BTI的情况下,每一个间接跳转(indirect jump)之后碰到的第一条指令必须是一个特殊的BTI指令。这个指令在不具备BTI的系统上就是no-op(什么都不做的指令);在具有BTI机制的硬件上,BTI指令可以不报出fault。如果跳过去的代码开头不是BTI指令,则会马上把当前进程杀死。 + +- 源码仓库: https://gitee.com/openeuler/kernel/ + +- 特性代码: arch/arm64/kernel arch/arm64/mm/mmu.c arch/arm64/net/bpf_jit_comp.c + +- 支持版本: openEuler 22.03 lts、openEuler 22.03 lts SP1 + +- 回合的关键patches: + | COMMITID | SUBJECT | openeuler OLK-5.10 enabled(Y/N)| + | ---------- | -------- | ---------- | + | ab7876a98a21 | arm64: elf: Enable BTI at exec based on ELF program properties | Y | + | ec94a46ee7ac | arm64: BTI: Decode BYTPE bits when printing PSTATE | Y | + | 0537c4cd71e3 | arm64: BTI: Reset BTYPE when skipping emulated instructions | Y | + | 30685d789c48 | KVM: arm64: BTI: Reset BTYPE when skipping emulated instructions | Y | + | 383499f8863e | arm64: BTI: Add Kconfig entry for userspace BTI |Y| + | 5d1b631c773f | arm64: bti: Document behaviour for dynamically linked binaries |Y| + | 47d67e4d1918 | arm64: insn: Report PAC and BTI instructions as skippable |Y| + | 92e2294d870b | arm64: bti: Support building kernel C code using BTI |Y| + | 714a8d02ca4d | arm64: asm: Override SYM_FUNC_START when building the kernel with BTI |Y| + | c8027285e366 | arm64: Set GP bit in kernel page tables to enable BTI for the kernel |Y| + | fa76cfe65c1d | arm64: bpf: Annotate JITed code for BTI |Y| + | 97fed779f2a6 | arm64: bti: Provide Kconfig for kernel mode BTI |Y| + | 3a9b136c998f | arm64: asm: Provide a mechanism for generating ELF note for BTI |Y| + | a6aadc28278a | arm64: vdso: Annotate for BTI |Y| + | 5e02a1887fce | arm64: vdso: Force the vDSO to be linked as BTI when built for BTI |Y| + | bf740a905ffe | arm64: vdso: Map the vDSO text with guarded pages when built for BTI |Y| + | 3a88d7c5c944 | arm64: kconfig: Update and comment GCC version check for kernel BTI |Y| + | e4e9f6dfeedc | arm64: bti: Fix support for userspace only BTI |Y| + | 9a964285572b | arm64: vdso: Don't prefix sigreturn trampoline with a BTI C instruction |Y| + | b9249cba25a5 | arm64: bti: Require clang >= 10.0.1 for in-kernel BTI support |Y| + | 2d21889f8b5c | arm64: Don't insert a BTI instruction at inner labels |Y| + | 2980e6070eef | Revert "arm64: bti: Require clang >= 10.0.1 for in-kernel BTI support" | Y | + +### 特性3:AMU(Activity Monitors Extension) + +- 特性详解 + +处理器包括基于AMUv1体系结构的活动监控。它旨在用于系统管理,而性能监控则针对用户和调试应用程序。活动监视器为系统电源管理和持续监控提供了有用的信息。活动监视器在操作中是只读的,它们的配置仅限于实现的最高异常级别。 + +Armv8允许实现最多16个计数器, 每个计数器可编程或统计固定事件. 当前系统可支持4个可编程的辅助计数器。 + +- 源码仓库: https://gitee.com/openeuler/kernel/ + +- 特性代码: arch/arm64/kernel arch/arm64/include/asm + +- 支持版本: openEuler 22.03 lts、openEuler 22.03 lts SP1 + +- 回合的关键patches: + | COMMITID | SUBJECT | openeuler OLK-5.10 ENABLED (Y/N) | +| ---------- | -------- |--------| +|2c9d45b43c39|arm64: add support for the AMU extension v1|Y| +|87a1f063464a |arm64: trap to EL1 accesses to AMU counters from EL0|Y| +|4fcdf106a433 |arm64/kvm: disable access to AMU registers from kvm guests|Y| +|6abde90881a5 |Documentation: arm64: document support for the AMU extension|Y| +|d91589556b6a|docs: amu: supress some Sphinx warnings|Y| +|59bff30ad6ce |Documentation: arm64: fix amu.rst doc warnings|Y| +|a0eef4a8acbb|Documentation: Chinese translation of Documentation/arm64/amu.rst|Y| +|ed159f972408|docs: zh_CN: amu.rst: fix document title markup|Y| diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx技术用户使用指南.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx技术用户使用指南.md deleted file mode 100644 index 81487c4..0000000 --- a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx技术用户使用指南.md +++ /dev/null @@ -1,25 +0,0 @@ - -# openEuler WayCa 鲲鹏xxx xxx用户使用指南 - -## 使用场景 - -- xxx - -## 硬件环境 -- xxx -- xxx 固件依赖需求可按照实际情况补齐 bmc cpld bios 最低版本要求。 - -## 软件版本 - -- xxx - -## 安装使用 - -- xxx - -## 交流答疑 - -- https://gitee.com/openeuler/WayCa/issue -标题标识: 【Way-Kunpeng-高速网络-xxx】 - -备注:用于交流基本使用、特性、场景、需求和问题答疑等。 \ No newline at end of file diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx模块特性介绍.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx模块特性介绍.md deleted file mode 100644 index e661c6e..0000000 --- a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-xxx模块特性介绍.md +++ /dev/null @@ -1,21 +0,0 @@ - -# openEuler WayCa 鲲鹏xxx xxx模块介绍 - -## xxx功能描述 - -## 特性详解 - -### 特性1:xxx -- 特性详解 -xxx -- 支持版本: openEuler 22.03 lts - -### 特性2:xxx -- 特性详解 -xxxx -- 支持版本: openEuler 22.03 lts openEuler 22.03 lts SP1 - -### 特性XX:xxx -- 特性详解 -xxx -- 支持版本: openEuler 22.03 lts openEuler 22.03 lts SP1 \ No newline at end of file
From: Jie Liu liujie375@h-partners.com
Signed-off-by: He Huang huanghe73@h-partners.com Signed-off-by: Jie Liu liujie375@h-partners.com --- ...g-高性能调度-AMU用户使用指南.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-AMU用户使用指南.md
diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-AMU用户使用指南.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-AMU用户使用指南.md new file mode 100644 index 0000000..996b29a --- /dev/null +++ b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-AMU用户使用指南.md @@ -0,0 +1,44 @@ +# Wayca-Kunpeng-高性能调度-AMU用户使用指南 + +当前Linux主线已支持该特性 + +## 1. 介绍 + +处理器包括基于AMUv1体系结构的活动监控。它旨在用于系统管理,而性能监控则针对用户和调试应用程序。活动监视器为系统电源管理和持续监控提供了有用的信息。活动监视器在操作中是只读的,它们的配置仅限于实现的最高异常级别。 + +## 2. 内核相关配置 + +AMU使能需要开启以下内核配置: +- CONFIG_ARM64_AMU_EXTN + +## 3. 软件接口 + +与PMU类似, AMU提供多个硬件计数器用于采集硬件事件, 按照实现分为两组计数器: +- 架构计数器组: + 包含4个用于统计固定事件的计数器: + | Event | Event Code | + |-------|------------| + |CPU_CYCLES|0x0011| + |CNT_CYCLES|0x4004| + |INST_RETIRED|0x0008| + |STALL_BACKEND_MEM|0x4005| +- 辅助计数器组: + Armv8允许实现最多16个计数器, 每个计数器可编程或统计固定事件. 当前系统可支持4个可编程的辅助计数器. + +硬件通过AMCFGR_EL0描述AMU的支持情况, 包括支持的计数器组数量及其它特性等. +硬件通过AMCGCR_EL0描述每组实现的计数器数量. +可以通过AMCNTEN{SET, CLR}{0, 1}_EL0对计数器进行禁用/使能. +AMU支持用户态访问. 通过AMUSERENR_EL0控制是否捕获EL0下的AMU访问操作. 在当前的主线内核中, 处于安全考虑访问权限未开放给用户态. 因此当前不支持在用户态访问AMU硬件. + +## 4. 涉及代码与使能 + +| COMMITID | SUBJECT | openeuler OLK-5.10 ENABLED (Y/N) | +| ---------- | -------- |--------| +|2c9d45b43c39|arm64: add support for the AMU extension v1|Y| +|87a1f063464a |arm64: trap to EL1 accesses to AMU counters from EL0|Y| +|4fcdf106a433 |arm64/kvm: disable access to AMU registers from kvm guests|Y| +|6abde90881a5 |Documentation: arm64: document support for the AMU extension|Y| +|d91589556b6a|docs: amu: supress some Sphinx warnings|Y| +|59bff30ad6ce |Documentation: arm64: fix amu.rst doc warnings|Y| +|a0eef4a8acbb|Documentation: Chinese translation of Documentation/arm64/amu.rst|Y| +|ed159f972408|docs: zh_CN: amu.rst: fix document title markup|Y|
From: Jie Liu liujie375@h-partners.com
Signed-off-by: He Huang huanghe73@h-partners.com Signed-off-by: Jie Liu liujie375@h-partners.com --- ...g-高性能调度-BTI用户使用指南.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-BTI用户使用指南.md
diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-BTI用户使用指南.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-BTI用户使用指南.md new file mode 100644 index 0000000..d8b77a9 --- /dev/null +++ b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-BTI用户使用指南.md @@ -0,0 +1,48 @@ +# Wayca-Kunpeng-高性能调度-BTI用户使用指南 + +当前Linux主线已支持该特性 + +## 1. 介绍 + +arm64架构是绝大多数移动设备的核心,这也就意味着arm64设备会成为全球攻击者的一个关注目标。因此,大家越来越关注于一些对arm64系统进行加固的技术。BTI是其中一种方法,这个功能是用来捕捉野跳转的。理念很简单:打开BTI的情况下,每一个间接跳转之后碰到的第一条指令必须是一个特殊的BTI指令。这个指令在不具备BTI的系统上就是no-op(什么都不做的指令);在具有BTI机制的硬件上,BTI指令可以不报出fault。如果跳过去的代码开头不是BTI指令,则会马上把当前进程杀死。 + +## 2. 内核相关配置 + +BTI使能需要开启以下内核配置: +- CONFIG_ARM64_PTR_AUTH +- CONFIG_ARM64_BTI +- CONFIG_ARM64_BTI_KERNEL (依赖CC_HAS_BRANCH_PROT_PAC_RET_BTI) + +需要注意的是BTI依赖编译器支持, 要求GCC版本大于等于9, 或Clang版本大于等于8. 要求编译器支持-mbranch-protection=pac-ret+leaf+bit. + +## 3. 软件接口 + +CPU通过ID_AA64PFR1_EL1描述BTI支持情况:当BIT[3:0]为0b0001时, 硬件支持BTI; 0b0000时硬件不支持。用户可以通过读取该寄存器获取硬件支持情况。 + +BTI主要由内核及编译器支持, 不需要用户态进行配置. 内核通过sctlr_el1控制BTI硬件使能, 通过PSTATE.BTYPE(Branch Target Identification Bit)判断是否跳转异常. + +## 4. 涉及代码与使能 +| COMMITID | SUBJECT | openeuler OLK-5.10 enabled(Y/N)| +| ---------- | -------- | ---------- | +| ab7876a98a21 | arm64: elf: Enable BTI at exec based on ELF program properties | Y | +| ec94a46ee7ac | arm64: BTI: Decode BYTPE bits when printing PSTATE | Y | +| 0537c4cd71e3 | arm64: BTI: Reset BTYPE when skipping emulated instructions | Y | +| 30685d789c48 | KVM: arm64: BTI: Reset BTYPE when skipping emulated instructions | Y | +| 383499f8863e | arm64: BTI: Add Kconfig entry for userspace BTI |Y| +| 5d1b631c773f | arm64: bti: Document behaviour for dynamically linked binaries |Y| +| 47d67e4d1918 | arm64: insn: Report PAC and BTI instructions as skippable |Y| +| 92e2294d870b | arm64: bti: Support building kernel C code using BTI |Y| +| 714a8d02ca4d | arm64: asm: Override SYM_FUNC_START when building the kernel with BTI |Y| +| c8027285e366 | arm64: Set GP bit in kernel page tables to enable BTI for the kernel |Y| +| fa76cfe65c1d | arm64: bpf: Annotate JITed code for BTI |Y| +| 97fed779f2a6 | arm64: bti: Provide Kconfig for kernel mode BTI |Y| +| 3a9b136c998f | arm64: asm: Provide a mechanism for generating ELF note for BTI |Y| +| a6aadc28278a | arm64: vdso: Annotate for BTI |Y| +| 5e02a1887fce | arm64: vdso: Force the vDSO to be linked as BTI when built for BTI |Y| +| bf740a905ffe | arm64: vdso: Map the vDSO text with guarded pages when built for BTI |Y| +| 3a88d7c5c944 | arm64: kconfig: Update and comment GCC version check for kernel BTI |Y| +| e4e9f6dfeedc | arm64: bti: Fix support for userspace only BTI |Y| +| 9a964285572b | arm64: vdso: Don't prefix sigreturn trampoline with a BTI C instruction |Y| +| b9249cba25a5 | arm64: bti: Require clang >= 10.0.1 for in-kernel BTI support |Y| +| 2d21889f8b5c | arm64: Don't insert a BTI instruction at inner labels |Y| +| 2980e6070eef | Revert "arm64: bti: Require clang >= 10.0.1 for in-kernel BTI support" | Y |
From: Jie Liu liujie375@h-partners.com
Signed-off-by: He Huang huanghe73@h-partners.com Signed-off-by: Jie Liu liujie375@h-partners.com --- ...g-高性能调度-SVE用户使用指南.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-SVE用户使用指南.md
diff --git a/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-SVE用户使用指南.md b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-SVE用户使用指南.md new file mode 100644 index 0000000..872fdcf --- /dev/null +++ b/WayCa-Kunpeng-底软/Wayca-Kunpeng-高性能调度/Wayca-Kunpeng-高性能调度-SVE用户使用指南.md @@ -0,0 +1,104 @@ +# Wayca-Kunpeng-高性能调度-SVE用户使用指南 + +当前Linux主线与Openeuler OLK-5.10已支持该特性 + +## 1. 介绍 + +随着 Neon 架构扩展(其指令集具有固定的 128 位向量长度)的开发,Arm 设计了可扩展向量扩展 (SVE) 作为 AArch64 的下一代 SIMD 扩展。SVE引入可扩展概念, 允许灵活的向量长度实现,使其能够在现在或将来的多应用场景下实现伸缩,允许CPU设计者自由选择向量的长度来实现。矢量长度可以从最小 128 位到最大 2048 位不等,以 128 位为增量。在当前实现中,最大实现向量长度为256位。SVE的设计保证同样的应用程序可以在支持SVE的不同实现上执行,而无需重新编译代码。在高性能计算跟机器学习场景具有优势,适用于大量数据处理的场景,通过将数据向量化,指令对向量进行操作,从而实现指令对数据批量处理,以加快运算速度。SVE2 扩展了 SVE 指令集,以支持高处理性能和机器学习之外的数据处理领域,例如计算机视觉、多媒体、游戏、LTE 基带处理和通用软件。 + +sve添加了以下寄存器: +- 32个可扩展的向量寄存器,Z0-Z31: +![avatar](https://documentation-service.arm.com/static/63b8334140f3173eeee2a7ca?token=) +- 16个可扩展的谓词寄存器,P0-P15: +![avatar](https://documentation-service.arm.com/static/63b8334140f3173eeee2a7cd?token=) +- 一个First Fault 谓词寄存器(FFR): +可扩展的向量系统控制寄存器ZCR_Elx + +## 2. 内核相关配置 + +SVE使能需要开启以下内核配置: +- CONFIG_ARM64_SVE + +## 3. 软件接口 + +### 3.1 支持检索 + +Linux下SVE支持情况通过CPU信息文件(/proc/cpuinfo)传递给用户态,也可以通过读取HWCAP_SVE或ID_AA64PFR0_EL1寄存器获取硬件SVE支持情况。 + +### 3.2 SVE配置 + +- 系统默认SVE向量长度配置 +Linux支持通过/proc/sys/abi/sve_default_vector_length文件获取并设置系统默认的SVE向量长度。除非用户通过prctl对线程SVE向量长度进行配置,默认情况下均使用该配置作为线程的默认长度。 +- 进程粒度的向量长度配置 +Linux支持运行时动态配置当前进程使用的SVE向量长度,可以通过prctl系统调用对当前进程的SVE向量寄存器宽度进行配置和管理,当前支持以下两个命令: +``` +PR_SVE_SET_VL + 设置当前线程的向量长度。当PR_SVE_VL_INHERIT标志设置时,子线程会继承当前的 + VL设置;否则子线程使用系统默认的向量长度设置。当PR_SVE_SET_VL_ONEXEC标志 + 设置时,仅当当前线程执行execve()时向量长度修改才会生效。 + 当修改生效时,P0-P15,FFR以及Z0-Z31寄存器(非低128bits)的数据均未定义。 +PR_SVE_GET_VL + 获取当前线程的向量长度设置。 +``` + +## 4. 涉及代码和使能 + +| COMMITID | SUBJECT |openeuler OLK-5.10 enabled(Y/N)| +| ---------- | ---------- | -----------| +| 27e64b4be4b8 | regset: Add support for dynamically sized regsets |Y| +| 94ef7ecbdf6f | arm64: fpsimd: Correctly annotate exception helpers called from asm | Y | +| abf73988a7c2| arm64: signal: Verify extra data is user-readable in sys_rt_sigreturn |Y| +| 93390c0a1b20| arm64: KVM: Hide unsupported AArch64 CPU features from guests |Y| +| b472db6cf8c6 | arm64: efi: Add missing Kconfig dependency on KERNEL_MODE_NEON|Y| +| 38b9aeb32fa7| arm64: Port deprecated instruction emulation to new sysctl interface |Y| +| 9cf5b54fafed| arm64: fpsimd: Simplify uses of {set, clear}_ti_thread_flag()|Y| +| 672365649cca |arm64/sve: System register and exception syndrome definitions |Y| +| 1fc5dce78ad1| arm64/sve: Low-level SVE architectural state manipulation functions |Y| +| ddd25ad1fde8| arm64/sve: Kconfig update and conditional compilation support |Y| +| d0b8cd318788| arm64/sve: Signal frame and context structure definition |Y| +| 22043a3c082a | arm64/sve: Low-level CPU setup |Y| +| bc0ee4760364 | arm64/sve: Core task context handling|Y| +| 79ab007c75d6| arm64/sve: Support vector length resetting for new processes |Y| +| 8cd969d28fd2 | arm64/sve: Signal handling support |Y| +| 7582e22038a2| arm64/sve: Backend logic for setting the vector length |Y| +| 8f1eec57cdcc | arm64: cpufeature: Move sys_caps_initialised declarations |Y| +| 2e0f2478ea37 | arm64/sve: Probe SVE capabilities and usable vector lengths |Y| +| 1bd3f93641ec| arm64/sve: Preserve SVE registers around kernel-mode NEON use |Y| +| fdfa976cae5c | arm64/sve: Preserve SVE registers around EFI runtime service calls |Y| +| 43d4da2c45b2 | arm64/sve: ptrace and ELF coredump support |Y| +| 2d2123bc7c7f | rm64/sve: Add prctl controls for userspace vector length management |Y| +| 4ffa09a939ab| arm64/sve: Add sysctl to set the default vector length for new processes|Y| +| 17eed27b02da | arm64/sve: KVM: Prevent guests from using SVE |Y| +| aac45ffd1f8e | arm64/sve: KVM: Treat guest SVE use as undefined instruction execution |Y| +| 07d79fe7c223 | arm64/sve: KVM: Hide SVE from CPU features exposed to guests |Y| +| 43994d824e84 | arm64/sve: Detect SVE and activate runtime support |Y| +| ce6990813f15 | arm64/sve: Add documentation |Y| +| 94b07c1f8c39| arm64: signal: Report signal frame size to userspace via auxv |Y| + +## 5.测试用例 + +以数组加权相加功能函数为例,一个为非sve版本函数,一个为sve版本函数 +void daxpy_1_1_no_sve(int64_t n, double da, double *dx, double *dy) +{ + for (int64_t i = 0; i < n; ++i) { + dy[i] = dx[i] * da + dy[i]; + } +} + +include <arm_sve.h> +void daxpy_1_1(int64_t n, double da, double *dx, double *dy) +{ + int64_t i = 0; + svbool_t pg = svwhilelt_b64(i, n); + do + { + svfloat64_t dx_vec = svld1(pg, &dx[i]); + svfloat64_t dy_vec = svld1(pg, &dy[i]); + svst1(pg, &dy[i], svmla_x(pg, dy_vec, dx_vec, da)); + i += svcntd(); + pg = svwhilelt_b64(i, n); + } + while (svptest_any(svptrue_b64(), pg)); +} + +使用gcc -march=armv8-a+sve xxx.c xxx命令在不支持sve系统与支持sve系统上分别运行./xxx运行