我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?
Can i check if a chunk of memory (e.g., allocated using malloc) stays in the cache?
假设我使用 malloc 分配了一些空间。我可以检查这个连续内存是否在运行时保留在 CPU 的缓存中(甚至更好的是缓存级别 L1、L2、L3 等)吗?
否,但您可以使用预取指令在使用前将其从内存移动到缓存。如果数据已经在缓存中,这些指令应该很快(有一些特定于体系结构的警告,但我不知道您使用的是哪个平台)。
您可以查询内存是否在缓存中的原因是,硬件在您可以轻松观察到的级别下管理内存。在具有硬件管理的 TLB 的架构上,内存将由任何地方的虚拟地址跟踪。
确定 CPU 缓存的内容是非常低级的,超出了 C 可以执行的操作。事实上,缓存对于您可能正在编写的代码是完全透明的,因为 CPU 几乎决定了要缓存的内容,并且不能浪费时间在如何执行此操作的复杂逻辑中。在谷歌上快速搜索了这方面的特定工具,得出了英特尔调优指南和性能分析论文:https://software.intel.com/en-us/articles/processor-specific-performance-analysis-papers。显然,这将是特定于供应商的。AMD可能会有特定的工具。
一般来说,至少对于大多数实际目的来说,没有(即使你可以,当你尝试使用这些信息时,它很可能已经过时了)。
如果您反复读取数据,您可以相当轻松地测量长期平均访问时间,这通常可以很好地指示数据的来源。
有一些(主要是嵌入式)处理器可以让您锁定缓存中的一些数据或将部分缓存留作您手动管理的可寻址内存。
相关文章:
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 是否有理由在标题中保留完全专用的模板?
- 即使在超出范围之后,我是否可以保留矢量数据
- cin.clear()是否保留EOF
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 内联函数是否在内联函数中保留其上下文
- 此常量引用是否保留了其生命?
- 如果其他人在等待,是否有标准的STL或QT方法可以产生互惠码,否则请保留它
- 向量是否知道在由一对迭代器初始化时首先保留?
- memcpy是否可以保留不同类型之间的数据
- C++,2D std::vector,我是否需要显式保留和推送空矢量
- 是否可以让gnucpp保留include宏
- 是否在值类型列表中保留引用类型
- 是否更正PInvoke签名以使用带有C#保留内存的嵌套结构
- 是否应将移出对象保留为"safe"状态?
- 是否可以在不声明其方法的情况下保留裸类定义?
- 检测几乎为零并将其替换为 0.0 或将它们保留为小数字是否更快?
- 检查磁盘是否插入到保留的分区中
- 在开发计算机上设置 dll 的完整性优先级是否会在安装生成中保留