x86 - 英特尔的 CLWB 指令使缓存行无效
问题描述
我正在尝试为英特尔的clwb指令查找不会使缓存行无效的配置或内存访问模式。我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试。Linux 版本为 5.4.0-3-amd64。我尝试使用 Device-DAX 模式并将这个字符设备直接映射到地址空间。我还尝试将此非易失性内存添加为新的 NUMA 节点并使用numactl --membind
命令将内存绑定到它。在这两种情况下,当我使用clwb缓存地址时,它都会被驱逐。我正在使用 PAPI 硬件计数器和禁用的预取器观察驱逐。
这是我正在测试的一个简单循环。array 和 tmp 变量,都被声明为 volatile,所以真正执行了加载。
for(int i=0; i < arr_size; i++){
tmp = array[i];
_mm_clwb(& array[i]);
_mm_mfence();
tmp = array[i];
}
两次读取都给出了缓存未命中。
我想知道是否有其他人试图检测是否存在某种配置或内存访问模式会将缓存行留在缓存中?
解决方案
clwb
行为类似于clflushopt
SKX 和 CSL。但是,clwb
在这些处理器上使用的程序在支持优化实现的未来进程上运行时将自动受益clwb
。
clwb
保留 ICL 上的高速缓存行。
请注意,来自InstLatx64cpuid
的叶子 0x7 信息表明 ICL 不支持,这是不正确的。clwb
clwb
Zen 2 也支持,但我不知道它在这个微架构上是如何工作的。
推荐阅读
- php - Laravel 5.4 中的调度程序,Crontab 无法自动工作
- azure-devops - 使用 API 调用更新 Azure DevOps 工件属性
- microsoft-dynamics - TaxTrans 和 LedgerTrans [AX 2009] 中的不同汇率
- c# - 为什么Thread类中没有Dispose函数
- nexus - Nexus 2.x OSS 是否支持多版本/自动老化?
- python-3.x - 为什么我的程序等待未加入的线程?
- c - ftell 如何影响以 'r' 而不是 'rb' 模式读取的二进制文件?
- python - 获取与 DOM 元素关联的事件列表
- php - 如何为 wordpress 制作 OG 图片
- mysql - 多个或查询中的顺序会影响相关性吗?