c # - hvordan man bestemmer CPU cache størrelse i. NET?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne vide, om der findes en måde at bestemme CPU-cache-størrelse i administreret kode?


Jeg skriver en Strassens algoritme til matrixmultiplikation i C # og vil gerne vide, hvor mange elementer i matrixerne jeg kunne passe i cache for at forbedre beregningshastigheden.

Bedste reference


Du kan bruge WMI til at hente cache-oplysninger.


Du skal først tilføje en henvisning til System.Management.dll til dit projekt, så kan du bruge følgende kode:


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;
        }
    }
}


Fuld Detaljer om WMI-klassen Win32\_CacheMemory er tilgængelig på:


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

Andre referencer 1


er det det du leder efter? Win32\_Processor-klassen har L2CacheSize og L3CacheSize-medlemmer. [6]

Andre referencer 2


Prøv denne kode


using System.Management;

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


Jeg får det fra her [7]