我可以在C++中控制复制到CPU缓存中的内容吗
Can I control what gets copied into CPU cache in C++?
我读过C++中的缓存优化以及现代CPU用来预测下一步需要什么数据并将其复制到缓存中的机制。但是,对于知道接下来实际需要什么的程序员来说,C++中有没有一种直接的方法来确定哪些数据被复制到CPU缓存中?
这因您使用的处理器和编译器而异。
假设您使用的是Intel x86/x64或兼容(例如AMD)处理器,该处理器会提供大量预取指令,大多数编译器都包含调用这些指令的内部函数。使用VC++时,可以使用_m_prefetch
或_m_prefetchw
。对于gcc,您可以使用__builtin_prefetch
。
同样,ARM上的VC++为相同的目的提供了__prefetch
内部函数(不,我真的不知道为什么它们不能使用与x86上相同的名称;签名和效果看起来完全相同)。
大多数其他相当现代的高端处理器可能提供类似的指令,并且我猜大多数编译器都提供了内部函数以使其可用,但与这些编译器一样,内部函数的名称也会有所不同。就这一点而言,即使函数是编译器的固有函数,大多数函数都需要包含一些标头才能使用它们,而且标头的名称也会有所不同。
Jerry提供的预取内部函数就可以完成任务。请记住,有几种风格由该函数的参数控制,用于确定缓存的哪些级别(如果有的话)将用于保持行。例如的prefetch_NTA不会污染缓存,而是只提供立即使用的行(并且在您很快就会使用它并且只使用一次的情况下使用)
还要记住,这些指令基本上是对CPU的提示(CPU自己也很好地猜测要预取哪些行)。因此,它们不能保证工作,在许多情况下可能会失败(如果加载了内存子系统,或者从内存中交换了地址)。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 访问多个阵列时 CPU 缓存的作用是什么?
- 如何刷新CPU缓存中的地址范围?
- 有没有办法刷新与程序相关的整个CPU缓存
- 优化 CPU 流水线和缓存访问
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- CPU 缓存是否也从以前的内存位置加载信息
- 英特尔 CPU 在处理大于其高速缓存行的类型时的预期行为是什么
- 防止 CPU 缓存
- 我可以在C++中控制复制到CPU缓存中的内容吗
- CPU缓存感知c++ / C编程
- 阻止或阻塞cpu数据缓存加载
- 在调试期间显示cpu缓存和寄存器内容
- c++堆栈内存和CPU缓存
- CPU度量(缓存未命中/缓存未命中)没有意义