2011-08-09 36 views
4

我想知道是否有办法确定托管代码中的CPU缓存大小?如何确定.NET中的CPU缓存大小?

我正在为C#中的矩阵乘法编写一个Strassen算法,并且想知道可以将多少个矩阵元素放入缓存以提高计算速度。

+0

我不认为你可以以管理的方式做到这一点。将不得不使用WMI。 – 2011-08-09 12:00:44

+0

...虽然WMI有托管API吗? –

+0

@Kieren:是的,通过COM Interop。我不确定当他说“管理”时,这是OP的意思。 – 2011-08-09 12:09:10

回答

6

您可以使用WMI来检索缓存信息。

你首先需要一个参考System.Management.dll添加到您的项目,那么你可以使用下面的代码:该Win32_CacheMemory WMI类的

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Management; 

namespace Scratch 
{ 
    public enum CacheLevel : ushort 
    { 
     Level1 = 3, 
     Level2 = 4, 
     Level3 = 5, 
    } 

    public static class CPUInfo 
    { 
     public static List<uint> GetCacheSizes(CacheLevel level) 
     { 
      ManagementClass mc = new ManagementClass("Win32_CacheMemory"); 
      ManagementObjectCollection moc = mc.GetInstances(); 
      List<uint> cacheSizes = new List<uint>(moc.Count); 

      cacheSizes.AddRange(moc 
       .Cast<ManagementObject>() 
       .Where(p => (ushort)(p.Properties["Level"].Value) == (ushort)level) 
       .Select(p => (uint)(p.Properties["MaxCacheSize"].Value))); 

      return cacheSizes; 
     } 
    } 
} 

全部详细信息,请访问:

http://msdn.microsoft.com/en-us/library/aa394080(v=vs.85).aspx

+0

谢谢你的回答。我会浏览WMI。 – GKalnytskyi

+1

@GKalnytskyi希望它有帮助。上面的代码给出了有关* all *缓存级别的信息,其中包括级别1,而其他'Win32_Processor'回答没有。 –

+0

谢谢你回答这个怪胎问题,而不是在谷歌的第一个命中,那里的答案是“你为什么需要这个?”。这实际上是这个网站上最令人讨厌的tic。 – hoodaticus

1

this你在找什么? Win32_Processor类具有L2CacheSize和L3CacheSize成员。

+0

+1不一定需要管理(WMI),但可以使用。 – 2011-08-09 12:00:19

+3

Bummer,他想知道1级缓存。 –

+0

谢谢你的回答,我会更详细地看看WMI。我只是认为有一个我无法找到的纯粹的托管解决方案。 – GKalnytskyi

1

试试这个代码

using System.Management; 

uint32 cachsize; 
public void CPUSpeed() 
{ 
    using(ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) 
    { 
    cachsize = (uint)(Mo["L2CacheSize"]); 
    } 
} 

我把它从Here

+0

谢谢!我会浏览WMI – GKalnytskyi