概述
这组PATCH增加了sysfs接口来控制CPU硬件预取行为对ARM64和X86进行用户态的性能调优。
1 背景
A64FX和一些intel处理器有依赖于实现的寄存器来控制CPU硬件预取行为。A64FX有IMP_PF_STREAM_DETECT_CTRL_EL0,intel处理器有MSR_MISC_FEATURE_CONTROL。这些寄存器不能从用户态访问。
使用这个的优点为改善性能。作为一个性能优化的例子,运行Stream benchmark在A64FX被描述。
对于MSR 0x1a4,通过MSR驱动也可以从用户态修改该值。但是不建议使用MSR驱动,因此它需要一个合适的内核接口。
因为这些原因,我们需要一个新的合适内核接口来控制IMP_PF_STREAM_DETECT_CTRL_EL0和MSR 0x1a4。
2 总体设计
驱动的源码分为通用部分(driver/base/pfctl.c)和架构部分(arch/xxx/pfctl.c)。通用部分描述为不依赖于架构的处理,比如创建sysfs。架构部分被描述为依赖于架构的处理。它必须至少包含支持哪种硬件预取单元以及如何对寄存器进行读和写。这些信息通过通用部分的注册函数被设置。
如果CPU支持硬件预取控制行为,驱动在每个CPU的cache/index目录下创建”prefetch_control”目录和一些属性文件。每个属性文件与父index目录的cache级别相关。
Sysfs接口的细节描述在文件Documentation/ABI/testing/sysfs-devices-system-cpu。
该驱动需要cache sysfs目录和cache level/type信息。在ARM处理器中,这些信息可以从寄存器中获取,而不需要从ACPI PPTT获取。
如果机器不支持ACPI PPTT和Kconfig,且支持硬件预取控制,我们可以增加处理来使用寄存器来创建cache/index目录。
这行为会造成一个问题,将在后面描述。
3 例子
本部分提供了一个在X86 INTEL_FAM6_BROADWELL_X上使用sysfs接口的例子。
这个模式有如下寄存器说明:
- L2硬件预取禁用
- L2相邻cache line预取禁用
- DCU硬件预取禁用
- DCU IP预取禁用
[63:4] 保留
在这个例子中,index0(L1D cache)与bit[2,3]相关,index2(L2 cache)与bit[0,1]相关。在CPU1的index0和index2的属性文件如下所示:
#ls /sys/devices/system/cpu/cpu1/cache/index0/prefetch_contol
Hardware_prefetcher_enable
Ip_prefetcher_enable
#ls /sys/devices/system/cpu/cpu1/cache/index2/prefetch_contol
Adjacent_cache_line_prefetcher_enable
Hardware_prefetcher_enable
如果用户想要禁用CPU1的L2相邻cache line,操作如下:
#echo 0 > /sys/devices/system/cpu/cpu1/cache/index2/prefetch_contol/Adjacent_cache_line_prefetcher_enable
在其他例子中,A64FX的index0如下所示:
#ls /sys/devices/system/cpu/cpu1/cache/index0/prefetch_control/
Stream_detect_prefetcher_dist
Stream_detect_prefetcher_enable
Stream_detect_prefetcher_strong
4 已知的问题
“lscpu”命令会以-ENOENT结束因为目录cache/index存在但shared_cpu_map文件不存在。这是因为patch 5,它创建了cache/index目录包含level和type,但没有ACPI PPTT。
LKML: Kohei Tarumizu: [PATCH v2 0/8] Add hardware prefetch control driver for arm64 and x86
最后
以上就是灵巧鸵鸟为你收集整理的增加对ARM64和X86的硬件预取控制驱动的支持1 背景2 总体设计3 例子4 已知的问题的全部内容,希望文章能够帮你解决增加对ARM64和X86的硬件预取控制驱动的支持1 背景2 总体设计3 例子4 已知的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复