c++ - 在彼此非常接近的范围内混合二进制数据和指令是否有缓存惩罚?

标签 c++ memory caching x86

我在程序上生成 128 字节的 block ,其中包含一些为机器语言函数保留的 n 字节 header ,我只是通过内联汇编调用这些函数。它们没有在任何地方定义,而是在运行时生成到分配到内存中的页面中,可以访问执行。但是,我想保留这些 block 的末尾 (128 - n) 字节用于存储在这些函数中使用的数据,因为能够将内存偏移调用缩小到 8 位而不是 32 位,并且(可能?)帮助缓存。但是,我担心的是缓存。

假设我有一个处理器,它既有数据缓存又有指令缓存,这种典型的处理器处理这种格式的效果如何?它会尝试在我的指令之后将数据作为指令本身加载到指令缓存中吗?这是否会导致显着的性能损失,因为处理器试图弄清楚如何处理这些垃圾和可能无效的“指令”,考虑到它们基本上每次调用都会在附近 float ?一旦我在数据段的头部第一次访问它,它会把这些数据加载到正常的 L1/L2 缓存中吗?或者它会在此时完全混淆吗?

编辑:我想我应该补充一点,吞吐量的优化显然相当重要。在这种情况下,优化的困惑程度或难度并不重要,只需最大限度地减少代码的执行时间即可。

最佳答案

在当今的处理器上,L2 和更高级别的缓存应该没问题,因为它们无论如何都是混合的。 L1 缓存(有时是密切相关的结构,如跟踪缓存、微操作缓存等)可能会受到这种欺骗的影响。从一种微体系结构到另一种微体系结构,这可能也会产生不同的影响。我希望任何跟踪/微操作缓存不会因无法解码的数据而受到损失,但我不会指望它。您必须尝试它并在与您的应用程序相关的微体系结构上进行基准测试。

编辑:您这样做是为了最小化生成代码的大小,还是为了保证在您有指令或其他原因时将数据保存在缓存中?这可能比您真正需要的更复杂。同样,基准测试和分析是您的 friend 。

关于c++ - 在彼此非常接近的范围内混合二进制数据和指令是否有缓存惩罚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1423489/

相关文章:

c++ - 如何使用指针用对象填充 vector

C++计算执行时间错误

c - 叉(); C 中的方法 : determine order

php内存限制垃圾收集器

ios - 检测 Alamofire 中缓存的响应

c++ - 如何从另一个类访问已经声明的类?

php - 为什么我在 C++ 和 PHP SHA256 哈希之间得到不同的结果?

C 共享内存数据库

java - 如何从 okhttp 的缓存中删除 url?

caching - Akamai 与 CloudFront