Я собираю небольшой патч для инструмент cachegrind/callgrind в valgrind, который будет автоматически обнаруживать, используя полностью общий код, CPU команды и конфигурации кэша (сейчас только автоматические настройки x86/x64 и другие архитектуры не обеспечивают конфигурацию типа CPUID для не-привилегированного кода). Этот код должен выполняться целиком в непривилегированном контексте, то есть в коде режима чистого пользователя. Он также должен быть переносимым в самых разных реализациях POSIX, поэтому grokking/proc/cpuinfo не будет работать, поскольку одна из наших систем назначения не имеет такой вещи.
Обнаружение частоты процессора, количества кешей, их размеров и даже размера строки кеша может быть выполнено с использованием 100% общего кода POSIX, который не имеет кодов операций, специфичных для процессора (просто много разумных предположений, таких как так как это добавление двух чисел вместе, если без задержек с памятью или регистром, возможно, будет выполнено за один цикл). Эта часть довольно проста.
Что не так просто, и почему я спрашиваю StackOverflow, как определить ассоциативность кеш-строк для заданного кеша? Ассоциативность - это то, сколько мест в кеше может содержать заданную строку кэша из основной памяти. Я вижу, что ассоциативность L1 кэша может быть обнаружена, но кеш L2? Несомненно, ассоциативность L1 мешает?
Я понимаю, что это, вероятно, проблема, которая не может быть решена. Но я бросаю его в StackOverflow и надеюсь, что кто-то знает что-то, чего у меня нет. Обратите внимание, что если мы потерпим неудачу здесь, я просто буду жестко закодировать по умолчанию по умолчанию, если предположить, что это не будет иметь большого значения для результатов.
Спасибо,
Найл