【问题标题】:How can we know if struct is on CPU cache or lost them to memory cache? [closed]我们如何知道 struct 是在 CPU 缓存上还是丢失到内存缓存中? [关闭]
【发布时间】:2018-09-05 14:49:54
【问题描述】:

我正在尝试编写 C# 游戏框架,所以性能在这里很关键。

这是我找到的reference

问题是,我们如何知道结构是否仍在 CPU 缓存中?

如果我们不能,那么将结构推送到内存缓存的场景是什么。

例如,将结构推送到 List 然后稍后访问它们,它是否仍然在 CPU 缓存上?

【问题讨论】:

  • 一般来说,导致某些东西从缓存中被驱逐的原因是其他东西想要/需要进入同一缓存行,即通常另一个线程推出您的缓存值。
  • 这个问题的答案是“视情况而定”。
  • 并非您为游戏开发的所有内容都对“性能至关重要”。事实上,你甚至可能因过度优化代码而损失的时间比获得的时间要多得多。例如,如果您寻找一些更快的代码,而每个应用程序只执行一次,您真的会关心 1 纳秒吗?
  • @HimBromBeere 我知道这应该依赖于语义而不是性能。但这是一个服务器端程序,我需要处理大量用户和游戏循​​环。
  • 首先,如果您有什么需要优化的地方,您会来找我们提供基准测试。

标签: c# .net performance cpu-cache


【解决方案1】:

您的问题的几乎所有答案都取决于它,但是您可以通过调试进程和监视 "Debug -> Windows -> Registers" 来查看 CPU 缓存中是否有某些内容,您可以在其中看到哪些内存地址被加载到每个寄存器中,并通过代码单步执行,您可以看到输出和输入的内容。这是我能做到的。

我建议您使用benchmarking 进行微优化,然后才开始挖掘更低的细节。

【讨论】:

    【解决方案2】:

    我们如何知道结构是否仍在 CPU 缓存中?

    不,不需要知道。

    如果我们不能,那么将结构推送到内存缓存的场景是什么。

    它会在处理它时就在那里,但会在它之后被丢弃。

    将一个结构推入 List 之后再访问它们,它还会在 CPU-cache 上吗?

    Push a struct to List<>是内存操作,CPU会做push的操作,但可能根本不需要加载,只需要修改pointer即可。但如果 CPU 稍后需要这些数据,数据将被 partiallysequentially 加载到 CPU 缓存中。

    通过SOFTWARE优化缓存性能,称为Cache-Conscious Data Structure,制作Pointer Based Data Structures Cache Conscious,会大大提高性能。大约 15 年前,我用 C 进行了一次测试,它大大提高了性能,大约提高了 70% 以上,但现在我丢失了这些代码。

    你必须首先使用性能工具专业:

    1. Visual studio performance tools 为您提供了识别代码的哪一部分在任何级别消耗性能的通用方法。
    2. 这篇帖子Value Types vs Reference Types 提供了Benchmark Runner 的一个很好的例子

    不可能实现一个可以满足所有建议的框架,就像您引用的 example 一样,它是逐个案例的。我想你可以放一个上下文,然后我们继续讨论。

    与内存相比,CPU 缓存非常小,它的单元只加载需要的数据,然后在处理后立即处理它,然后在下一个内存地址中加载下一个数据(如果存在),但引用类型可以将 NEXT 数据存储在其他地方,但是不是 NEXT 位置,这会降低定位它的性能。这就是为什么出现 3 级缓存的原因,3 级缓存会尝试为 2 级定位数据,然后 1 级将从更快的缓存中使用它。

    List<T> 是一个引用类型,它将在heap 的不同内存块中托管一个实例,然后使性能稍差,但值类型对象使用stack,它可以将数据保持在一起,然后是CPU可以更快地加载它们,但您还必须指定操作来改进您的案例,它在任何实际项目中并不总是通用的。

    实际上,为了提高性能,LINQ 将多种对象转换为值类型structure,而不是继续使用class 本身。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2018-03-09
      • 1970-01-01
      • 2015-05-26
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2012-09-17
      相关资源
      最近更新 更多