2011-12-19 6 views
5

Я работаю над обнаружением ЦП и общим кодом обнаружения окружающей среды для моей операционной системы хобби. Есть ли когда-нибудь, когда CPUID нужно вызывать несколько раз? То есть, если система имеет несколько ядер, нужно ли ОС вызывать CPUID на каждом ядре? То же самое для NUMA.CPUID на нескольких ядрах/NUMA

Оба руководства AMD и Intel CPUID неясны. Существует статья об wsdev wiki, в которой упоминается вызов CPUID с именем Detecting CPU Topology, но в моем чтении не было ясно, когда и сколько раз требуется идентификатор CPUID.

+0

Я полагаю, что одна ситуация, когда CPUID может действовать необычно, - это AMD Fusion, которая содержит как процессор, так и графический процессор на одном чипе. Для получения дополнительной информации вы должны посмотреть документацию. Помимо этого, я не понимаю, почему в каком-либо внутреннем ядре процессора будет отображаться другой CPUID, чем другой ядро. – Polynomial

+0

Помимо данного ответа, еще одна причина для вызова CPUID несколько раз - это использование команды rdtsc для измерения производительности. Обычно вы используете cpuid перед тем, как cpuid является инструкцией «сериализации» и предотвращает конвейерную обработку, но cpuid также имеет неприятную привычку принимать больше времени, чтобы выполнить первые несколько раз, когда это называется (согласно старому руководству intel на rdtsc), поэтому это типично для вызовите его несколько раз при запуске, чтобы убедиться, что он ускорен, а затем используйте его перед всеми вызовами rdtsc. –

ответ

3

Поскольку прошло почти неделю, и никто не смог ответить на этот вопрос (вероятно, из-за праздников), я попытаюсь ответить на это в любом случае.

Я думаю, что да. Возможно, вам понадобится позвонить CPUID на каждое ядро. Одной из причин этого является то, что не все (даже x86) системы сегодня однородны.

Например, я прочитал на форуме по разгону (я не могу найти ссылку), что можно смешать две модели разных моделей процессоров на некоторых двухъядерных серверных платах. У человека была двойная розетка 1366 с двумя разными скоростными процессорами. (и другая модель #s)

Так что в этом случае вызов CPUID будет зависеть от того, какой процессор был включен, поэтому вам нужно будет вызвать его, как только каждый процессор получит всю информацию.

В руководствах одной из моих материнских плат-серверов также указано, что вам разрешено смешивать процессоры разных моделей (с определенными ограничениями). И, конечно же, можно смешать две разные модели steppings той же модели процессора.


Эта причина в одиночку (гетерогенная топология), уже причина нужно вызвать CPUID на каждом ядре.

+0

Прошу прощения за долгое время, но я верю, что это правильно. Каждый процессор на кристалле должен иметь информацию CPUID, извлеченную и сохраненную. – nixeagle

+0

Итак, что произойдет, если вы успешно вызываете CPUID на каждом ядре каждого процессора с разными наборами команд; то есть один процессор имеет SSSE3, другой SSSE4.2. Затем вы используете эту информацию, чтобы принять решение о вводе фрагмента кода, который использует инструкции SSE4.2. В середине выполнения этого кода ОС свопит ваш поток, а затем он запланирован на CPU, поддерживающий только SSSE3. Затем происходит сбой кода, выполняющего инструкцию SSE4.1. Поэтому недостаточно даже вызвать CPUID на нескольких ядрах, после этого нужно даже установить сходство потоков. Это верно? – Apriori

+0

@Apriori Это звучит крайне маловероятно. Я знаю одну конфигурацию Intel или AMD x86, которая позволит вам устанавливать разные процессоры из разных поколений с разными наборами инструкций. Но если вы хотите быть чрезмерно осторожными, да, вы можете это сделать. Я думаю, что это слишком утомительно. – Mysticial