【问题标题】:Is accessing CPU cache (read and write) through C# possible?是否可以通过 C# 访问 CPU 缓存(读写)?
【发布时间】:2011-09-03 08:51:13
【问题描述】:

我想知道 C# 中是否有实现的东西允许访问 CPU 缓存。这对我来说很有趣,但目前我与 cpu 缓存无关。所以我想知道它是系统限制访问还是用户也可以使用。我说的是 L1/L2 或其他任何名称!

很高兴听到您的 cmets、外部链接以及一些代码 sn-ps!谢谢。

【问题讨论】:

  • 不可能编写出访问c​​pu缓存的真正C#代码。所有内存读取和写入都经过缓存。这个问题没什么意义。
  • @Hans 好吧,我知道缓存是否会被一些 0 和 1 填满,但问题是我们是否可以控制那里发生的事情在缓存中。
  • 通过解释您认为需要控制缓存的原因,让这个问题成为一个可回答的问题。
  • @Hans 好吧,我只是想知道这样的事情是否存在,那么你是对的,我应该换个方式问这个问题。
  • @HansPassant 可能是dl.acm.org/citation.cfm?id=2046670

标签: c# cpu second-level-cache


【解决方案1】:

没有任何编程语言可以直接访问 CPU 缓存。读取和写入缓存是由硬件自动完成的;没有办法编写将缓存视为任何类型的单独实体的指令。对缓存的读取和写入是所有涉及内存的指令的副作用。

【讨论】:

  • 也许是一个很好的通用答案,但ARM9 can in fact dump cache for review in software。我假设它维护缓存的副本,以便软件读取一些代理寄存器,而不会受到影响 实际 缓存的相同操作的影响。
  • 这似乎不是真的。我已经看到操作系统开发,其中明确使用 L2 共享文件。因此操作系统必须有一点控制权,并且操作系统是用编程语言编程的。
【解决方案2】:

对于这种类型的活动,C# 的级别有点太高了。除非您调用其他一些用 C/ASM 编写的库 =) 当然,使用缓存通常是一个非常晦涩的话题,并且在大多数情况下它完全由硬件控制。另一方面,您可能已经遇到过一些关于 SO 的非常有趣的问题/讨论。

C++ cache aware programming
How can I do a CPU cache flush in x86 Windows?

无论如何,尽管存在限制,您仍然可以(在一定程度上)预测缓存将要做什么,并将其用于特殊应用程序。

【讨论】:

  • 好点 AR,但是当你有多个内核和共享 L2 缓存等等时,这样做会变得更加困难。
  • 不要误会我的意思,这不是我会用十英尺的杆子尝试的东西。我能想到更令人兴奋的方法来让我头疼=D
【解决方案3】:
public static string GetComponent(string hwclass, string syntax)
    {
        var mos = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + hwclass);
        foreach (var o in mos.Get())
        {
            var mj = (ManagementObject)o;
            CpuModel = Convert.ToString(mj[syntax]);
        }
        return CpuModel;
    }

private string L2CacheSize = HardwareManagement.GetComponent("Win32_Processor", "L2CacheSize");
private string L3CacheSize = HardwareManagement.GetComponent("Win32_Processor", "L3CacheSize");

【讨论】:

  • 虽然这可能会回答问题,但最好解释答案的基本部分。
  • 看起来很有趣,你有没有对其进行测试/基准测试?
猜你喜欢
  • 2011-12-10
  • 2014-11-10
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多