2013-01-17 4 views
3

Я хочу, чтобы мой код сбросился из кеша L2 как можно больше.Как контролировать кеш процессора в Windows?

Как бы вы это достигли на C++/C# и как бы вы сделали его подотчетным.

EDIT: Можно ли собирать количество промахов в L2 в качестве альтернативы? Ответ: Да Can I get the L2 cache miss count of each process on the windows platform?

+2

Не напрямую, нет. VTune может рассказать вам кое-что о вещах вроде того, сколько данных перемещается между кешами, но не что-то (по крайней мере, к моему воспоминанию) о том, какие данные находятся на определенном уровне кеша. Вы сильно зацикливаетесь на том, что это вручную, на основе адресов, где хранятся данные, и когда/как вы его используете. –

+1

Есть несколько MSR, которые позволяют вам читать информацию об использовании кеша, но это, вероятно, все еще не так круто, как вы хотите. Проблема в том, что это похоже на кошку Шредингера. Посмотрите на это: http://stackoverflow.com/questions/10122520/profiling-cpu-cache-memory-from-the-os-application – thang

ответ

1

Кажется, что люди неохотно отдают информацию в этой области (C++ или C# не имеет значения). поэтому я мог бы, вероятно, создать свою собственную стратегию, которая, вероятно, будет использовать множество подходов, а не жесткий набор правил или рецептов.

Для достижения максимального коэффициента попадания/промаха для приложения Windows, я бы, вероятно:

  • выделить физический процессор для приложения, убедившись, что никакие другие процессы не используют его, отключить гиперпоточность, работа с BIOS, как производители серверов часто предоставляют конкретные настройки для приложений с малой задержкой.
  • убедитесь, что кусок кода имеет размер меньше, чем кэш L2 на этом ядре ЦП
  • убедитесь, что код не имеет чего-то, что делает его явно отключенным от кеша (например, барьеры памяти в C#)
  • контрольный номер L2 (http://stackoverflow.com/questions/5141350/can-i-get-the-l2-cache-miss-count-of-each-process-on-the-windows-platform)
0
public enum CacheLevel : ushort 
{ 
    Level1 = 3, 
    Level2 = 4, 
    Level3 = 5, 
} 

public static List<UInt16> GetCacheSizes(CacheLevel cacheLevel) 
{ 
    ManagementClass mClass = new ManagementClass("Win32_CacheMemory"); 
    ManagementObjectCollection collection = mClass.GetInstances(); 
    List<UInt32> sizes = new List<UInt32>(collection.Count); 

    sizes.AddRange(collection.Cast<ManagementObject>() 
     .Where(x => (UInt16)(x.Properties["Level"].Value) == (UInt16)cacheLevel) 
     .Select(x => (UInt32)(x.Properties["MaxCacheSize"].Value))); 

    return sizes; 
} 
+0

не будет просто показывать, сколько кеша имеет процессор? Я спрашиваю о мониторинге использования кеша. Я, очевидно, вижу размер с веб-сайта Intel. Разве я не могу? –

+0

Ops Извините, я неверно истолковал ваш вопрос: S –

+0

@TommasoBelluzzo Затем вы должны удалить этот ответ. – RoG

4

Вопрос, кажется, основан на непонимании того, как работает кэширование на современных процессорах x86. Например, он говорит «L2 вместо L3». Почти на всех современных процессорах x86 (как Intel, так и AMD) невозможно получить данные в кэше L2 вместо кеша L3. Это приведет к сбою когерентности кэша, поскольку отсутствие данных в кэше L3 сигнализирует о его отсутствии в кэшах L2 и позволяет ядру не предполагать, что никакое другое ядро ​​не кэшировало его.

К сожалению, люди, которые мало знают о том, как работают ЦП, не должны пытаться контролировать, какие данные находятся в их кэшах. Было бы чудесно, если бы они сделали вещи лучше, чем люди, которые разработали эти процессоры в первую очередь.

+1

спасибо за остроумный ответ. но это useles. о, подождите секунду, но вы знаете, что .. позвольте мне изменить вопрос, может быть, вы бы дали реальный ответ .. вы знаете. просто для удовольствия –

+0

На самом деле, я думаю, что вы должны задать правильный вопрос, если бы вы были более добры, чем любой «реальный ответ» на ваш первоначальный вопрос. –

+1

уверенный вещь. как вы проходите время :))) спасибо Дэвиду, или это Иисус?:)))))) –

Смежные вопросы