CPUID на нескольких ядрах/NUMA

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

Как AMD, так и Intel Руководства по CPUID неясны по этому поводу. В вики osdev есть статья, в которой упоминается вызов CPUID под названием Определение топологии ЦП, но для мое чтение было неясным, когда и сколько раз нужно вызывать CPUID.


person nixeagle    schedule 19.12.2011    source источник
comment
Я предполагаю, что одной из ситуаций, когда CPUID может вести себя необычно, является AMD Fusion, который содержит и ЦП, и ГП на одном чипе. Вам нужно взглянуть на документацию для получения дополнительной информации. Кроме этого, я не понимаю, почему любое внутреннее ядро ​​​​ЦП будет показывать другой CPUID, чем другое ядро.   -  person Polynomial    schedule 20.12.2011
comment
Помимо данного ответа, еще одной причиной многократного вызова CPUID является использование инструкции rdtsc для измерения производительности. Обычно вы используете cpuid перед ним, так как cpuid является инструкцией «сериализации» и предотвращает конвейерную обработку, но cpuid также имеет неприятную привычку выполняться дольше в первые несколько раз, когда он вызывается (согласно старому руководству Intel по rdtsc), поэтому типично вызовите его несколько раз при запуске, чтобы убедиться, что он ускорился, а затем используйте его перед всеми вашими вызовами rdtsc.   -  person Joseph Garvin    schedule 02.09.2012


Ответы (1)


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

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

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

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

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


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

person Mysticial    schedule 25.12.2011
comment
Извините за долгий ответ, но да, я считаю, что это правильно. Для каждого процессора на кристалле необходимо извлечь и сохранить информацию CPUID. - person nixeagle; 23.03.2012
comment
Итак, что произойдет, если вы успешно вызовете CPUID на каждом ядре каждого процессора с разными наборами инструкций; т.е. у одного процессора SSSE3, у другого SSSE4.2. Затем вы используете эту информацию, чтобы решить ввести фрагмент кода, который использует инструкции SSE4.2. В середине выполнения этого кода ОС заменяет ваш поток, а затем по расписанию он находится на ЦП, поддерживающем только до SSSE3. Затем происходит сбой кода при выполнении инструкции SSE4.1. Таким образом, недостаточно даже вызвать CPUID на нескольких ядрах, после этого нужно даже установить сходство потоков. Это верно? - person Apriori; 28.03.2014
comment
@Apriori Это звучит крайне маловероятно. Я знаю одну конфигурацию Intel или AMD x86, которая позволит вам устанавливать разные процессоры разных поколений с разными наборами инструкций. Но если вы хотите быть чрезмерно осторожным, да, вы можете это сделать. Хотя я думаю, что это перебор. - person Mysticial; 28.03.2014
comment
Я подумал, что такой подход звучит немного параноидально, но когда-нибудь это может стать забавным аварийным дампом. Во всех объяснениях, которые я читал, описывающих, как использовать инструкцию CPUID, ничего не упоминается о сценарии с несколькими процессами/ядрами; но похоже, что это может быть более серьезной проблемой, чем кажется большинству разработчиков, использующих x86 SIMD. Еще одна вещь, которую я не понимаю, - это то, что лучше всего вызывать CPUID каждый раз, когда ваш код может разветвляться, или один раз и кэшировать результат. Агнер Фог имеет CPUID как задержку от 100 до 250 циклов на Sandy Bridge. Я отвлекся, это может потребовать нового вопроса; который я счастлив опубликовать. - person Apriori; 28.03.2014
comment
@Apriori Поправка к моему последнему комментарию. Я не в курсе. Я как-то пропустил это слово. Короче говоря, я не думаю, что можно построить систему, в которой процессоры имеют разные наборы инструкций. Я предполагаю, что это возможно внутри виртуальной машины, но тогда это просто просьба. - person Mysticial; 28.03.2014
comment
Спасибо, что назвали это. У меня заканчивались символы в моем последнем ответе, чтобы упомянуть, что я предположил, что вы имели в виду, что не знаете. Я полагаю, хотя, предполагая один набор наборов инструкций на машину, тогда, если диспетчеризация была единственным, для чего инструкция CPUID используется в вашем программном обеспечении, тогда нужно было бы вызывать CPUID только один раз для каждой системы, а не один раз для каждого ядра; в этом очень конкретном случае. - person Apriori; 28.03.2014