我正在生成一个合成C基准测试,旨在通过以下Python脚本导致大量的指令获取错过:

#!/usr/bin/env python

import tempfile

import random

import sys

if __name__ == '__main__':

functions = list()

for i in range(10000):

func_name = "f_{}".format(next(tempfile._get_candidate_names()))

sys.stdout.write("void {}() {{\n".format(func_name))

sys.stdout.write(" double pi = 3.14, r = 50, h = 100, e = 2.7, res;\n")

sys.stdout.write(" res = pi*r*r*h;\n")

sys.stdout.write(" res = res/(e*e);\n")

sys.stdout.write("}\n")

functions.append(func_name)

sys.stdout.write("int main() {\n")

sys.stdout.write("unsigned int i;\n")

sys.stdout.write("for(i =0 ; i < 100000 ;i ++ ){\n")

for i in range(10000):

r = random.randint(0, len(functions)-1)

sys.stdout.write("{}();\n".format(functions[r]))

sys.stdout.write("}\n")

sys.stdout.write("}\n")

代码所做的只是生成 C program ,它由许多随机命名的虚函数组成,这些函数又在 main() 中以随机顺序调用 . 我正在使用 -O0 在CentOS 7下使用gcc 4.8.5编译生成的代码 . 该代码在配备2x Intel Xeon E5-2630v3(Haswell架构)的双插槽机器上运行 .

我感兴趣的是在分析 binary compiled from the C code (不是Python脚本,仅用于自动生成代码)时理解perf报告的与指令相关的计数器 . 特别是,我正在使用 perf stat 观察以下计数器:

instructions

L1-icache-load-misses (指令提取错过L1,又名Haswell上的r0280)

r2424 , L2_RQSTS.CODE_RD_MISS (指令提取错过L2)

rf824 , L2_RQSTS.ALL_PF (所有L2硬件预取程序请求,包括代码和数据)

我首先在BIOS中禁用了所有硬件预取程序的代码,即

MLC Streamer禁用

MLC空间预取器已禁用

DCU数据预取器已禁用

DCU指令预取器已禁用

结果如下(进程被固定到第二个CPU的第一个核心和相应的NUMA域,但我想这没有太大的区别):

perf stat -e instructions,L1-icache-load-misses,r2424,rf824 numactl --physcpubind=8 --membind=1 /tmp/code

Performance counter stats for 'numactl --physcpubind=8 --membind=1 /tmp/code':

25,108,610,204 instructions

2,613,075,664 L1-icache-load-misses

5,065,167,059 r2424

17 rf824

33.696954142 seconds time elapsed

考虑到上面的数字,我无法解释L2中如此大量的指令获取失误 . 我已禁用所有预取程序, L2_RQSTS.ALL_PF 确认如此 . 但为什么我看到L2中的指令获取次数比L1i多两倍?在我的(简单)心理处理器模型中,如果在L2中查找指令,则必须先在L1i中查找 . 显然我错了,我错过了什么?

然后,我尝试在启用所有硬件预取程序的情况下运行相同的代码,即

MLC Streamer已启用

MLC Spatial Prefetcher已启用

DCU数据预取器已启用

DCU指令预取器已启用

结果如下:

perf stat -e instructions,L1-icache-load-misses,r2424,rf824 numactl --physcpubind=8 --membind=1 /tmp/code

Performance counter stats for 'numactl --physcpubind=8 --membind=1 /tmp/code':

25,109,877,626 instructions

2,599,883,072 L1-icache-load-misses

5,054,883,231 r2424

908,494 rf824

现在, L2_RQSTS.ALL_PF 似乎表明发生了更多的事情,虽然我预计预取器会更具攻击性,但我认为由于跳跃密集型工作负载和数据预取器没有,预编译器严重受到测试与这种工作量有很大关系 . 但同样, L2_RQSTS.CODE_RD_MISS 仍然太高,启用了预取器 .

所以,总结一下,我的问题是:

禁用硬件预取程序后, L2_RQSTS.CODE_RD_MISS 似乎远高于 L1-icache-load-misses . 即使启用了硬件预取程序,我仍然无法解释它 . 与 L1-icache-load-misses 相比,如此高的 L2_RQSTS.CODE_RD_MISS 背后的原因是什么?

java 中_l1,L2指令获取错过远高于L1指令获取未命中相关推荐

  1. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)

    velocity本身支持自定义标签和指令的扩展,我们看看扩展指令的步骤及searchweb2的应用场景, 1.使用方法 在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用 ...

  2. java yyyy-mm-dd 毫秒_如何在Java中以YYYY-MM-DD HH:MI:秒毫秒格式获取当前时间?

    下面的代码为我提供了当前时间. 但这并不能说明毫秒. public static String getCurrentTimeStamp() { SimpleDateFormat sdfDate = n ...

  3. java上传文件堆溢出_我的正则表达式导致Java中的堆栈溢出;我错过了什么?

    我试图使用Scanner的正则表达式来匹配文件中的字符串.正则表达式适用于该行以外的所有内容: DNA="ITTTAITATIATYAAAYIYI[....]ITYTYITTIYAIAIYI ...

  4. java pattern堆栈溢出_我的正则表达式导致Java中的堆栈溢出;我错过了什么?

    我试图使用Scanner的正则表达式来匹配文件中的字符串.正则表达式适用于该行以外的所有内容: DNA="ITTTAITATIATYAAAYIYI[....]ITYTYITTIYAIAIYI ...

  5. 如何从Java中的字符串值获取枚举值?

    说我有一个枚举 public enum Blah {A, B, C, D } 我想找到一个字符串的枚举值,例如"A"就是Blah.A 怎么可能做到这一点? Enum.valueOf ...

  6. Java中的Unsafe

    Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存.Java中的Unsafe类为我们提供了类似C++手动管理内存的能力. Uns ...

  7. Java中CAS(Compare And Swap,比较和交换)算法的技术原理简述

    - title: Java中CAS(Compare And Swap,比较和交换)算法的技术原理简述 - date: 2021/8/14 文章目录 CAS全称 Compare And Swap,是一种 ...

  8. Java中的volatile

    文章目录 1.volatile的内存语义 2.内存屏障 2.happens-before 之 volatile 变量规则 4.Demo 1.volatile的内存语义 内存可见性 ​ volatile ...

  9. java中bjt和utc转化_如何在Java中转换UTC和本地时区

    我对Java中的时区感到好奇.我想从设备获取UTC时间(以毫秒为单位)并发送到服务器.当服务器向用户显示时间时,服务器会将其转换为本地时区.我系统中的时区是澳大利亚/悉尼(UTC + 11:00),测 ...

最新文章

  1. httpd启动不能加载模块
  2. html图片加波浪滤镜,CSS滤镜wave属性(波形滤镜)
  3. 如何编辑UG中打开文件的历史记录信息(history.pax)?
  4. Source Insight checking for modified files 卡顿(Reload externally modified files automatically取消)(未解决)
  5. ibatis提示Unable to load embedded resource from assembly Entity.Ce_SQL.xml,Entity.
  6. Tomcat部署时没有项目
  7. CCNA-第十三篇-NAT-上
  8. Spring源码解析(二)BeanDefinition的Resource定位
  9. 写给人类的机器学习 翻译完成
  10. 【Flink】Flink 流API 和 Table 以及 SQL API是否可以共存
  11. java多线程 Java核心技术 读书笔记
  12. python UI自动化(一)
  13. 内存分区0x00000000-0x0000FFFF共64K是null指针
  14. 基于朴素贝叶斯的新闻分类
  15. html语言如何给网页添加标题,html网页标题标签 html文件添加标题使用什么标记...
  16. nwjs编写浏览器外壳
  17. Laragon 在 Windows 中搭建 Laravel 开发环境
  18. 计算机硬盘的文件怎么删除文件,如何清理磁盘多余文件 电脑清除多余的空间及文件的图文步骤...
  19. 王烁30天认知训练营推荐书单
  20. UVA 524素数环

热门文章

  1. 【难题+重点】剑指offer——面试题40:数组中只出现一次的数字
  2. 在Macbook M1上安装Parallels Desktop 17虚拟机和Originlab 2021
  3. Python使用XGBoost
  4. express 模板 及 文件上传
  5. k8s部署nacos
  6. js字符串常用方法详解
  7. jgGrid pivot reload重新加载及刷新数据
  8. IOC容器和Bean的配置
  9. Oracle - 查询语句 - 多表关联查询
  10. (笔记)Mysql命令show databases:显示所有数据库