安装前配置
以上描述的优化特性,都已经写入到patch文件中,对源码应用patch文件之后,就可以使能该特性。
利用SVE加速向量运算
预置条件
CPU支持SVE指令优化。
查看方式
通过以下命令查看CPU是否支持SVE指令优化。
lscpu
回显结果中Flags行包含SVE,表示CPU支持SVE指令优化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Architecture: aarch64 CPU op-mode(s): 64-bit Byte Order: Little Endian CPU(s): 320 On-line CPU(s) list: 0-319 Vendor ID: HiSilicon BIOS Vendor ID: HiSilicon BIOS Model name: Kunpeng 920 7285Z Model: 0 Thread(s) per core: 2 Core(s) per socket: 80 Socket(s): 2 Stepping: 0x0 Frequency boost: disabled CPU max MHz: 3000.0000 CPU min MHz: 400.0000 BogoMIPS: 200.00 Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc fla gm ssbs sb paca pacg dcpodp flagm2 frint svei8mm svef32mm svef64mm svebf16 i8mm bf16 dgh rng ecv Caches (sum of all): L1d: 10 MiB (160 instances) L1i: 10 MiB (160 instances) L2: 200 MiB (160 instances) L3: 280 MiB (4 instances) NUMA: NUMA node(s): 4 NUMA node0 CPU(s): 0-79 NUMA node1 CPU(s): 80-159 NUMA node2 CPU(s): 160-239 NUMA node3 CPU(s): 240-319 Vulnerabilities: Gather data sampling: Not affected Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Retbleed: Not affected Spec rstack overflow: Not affected Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl Spectre v1: Mitigation; __user pointer sanitization Spectre v2: Not affected Srbds: Not affected Tsx async abort: Not affected |
编译选项
GCC编译时,通过“-march”编译选项指定ARM架构版本以及扩展指令集。本特性patch中通过以下编译选项使用SVE:
1
|
-march=armv8-a+sve -msve-vector-bits=256 |
前者表示使用SVE指令集,后者指定SVE可变向量长度的位数。
利用PF预取加速数据处理
在频繁进行循环操作、并行计算、缓存未命中率较高等情况下,使用PF(预取)可以加速数据处理,提高系统性能。
硬件预取
硬件预取是通过跟踪指令和数据地址的变化,将指令和地址提前读到Cache里。建议在BIOS中将预取功能开启。
- 重启服务器,进入BIOS设置界面。
- 在BIOS中,选择“Advanced>MISC Config”,按“Enter”键进入。
- 将“CPU Prefetching Configuration”设置为“Enabled”,按“F10”键保存退出。
软件预取
在ARM架构中,可以使用PRFM(Prefetch Memory)指令来实现数据预取。预取指令会将数据加载到缓存中,但不会立即被处理器使用。预取的数据通常会放入L1数据缓存中。如果L1缓存已满,数据可能会被放入L2缓存或L3缓存(如果存在)。除此之外,还可以通过调整预取步长来进一步优化预取效果。
以下是预取指令在C++中的实现。
1
|
#define PLDL1KEEP_OFF(ptr, off) __asm__ volatile("prfm PLDL1KEEP, [%0, #(%1)]"::"r"(ptr), "i"(off):)
|
在本特性中,预取指令会加入到SVE加载指令之前以结合使用两个优化特性。
父主题: 特性指南