2016-12-29 1 views
-3

Мне нужно написать код сборки x86, который должен запускаться на процессоре Intel x86.Как написать код сборки x86 для проверки влияния температуры на производительность процессора

На самом деле необходимо написать как дополнение или переместить инструкции, чтобы увидеть влияние этих инструкций на производительность процессора w.r.t. Это означает, что мой код должен быть способен контролировать выработку тепла от процессора.

Если у вас есть такой код или у кого-либо есть опыт написания такого типа кода, поделитесь им.

+0

Отредактировано ваше название, чтобы люди не были введены в заблуждение «злыми». Если вам нужна «контролируемая теплогенерация», используйте метод обратной связи. Возможно, вам не понадобится asm. – Jester

+1

Подождите минуту «проверьте влияние температуры на производительность?» Почему вы пишете свой собственный код для этого? Почему бы вам просто не использовать prime95, чтобы вызвать термическое дросселирование, как обычный человек? Я не заметил, что часть ответа «проверить влияние на производительность» во время ответа, так как вы даже не упомянули об этом в теле вопроса. –

+0

Спасибо @PeterCordes. Для моего проекта я должен это сделать. И потому что я хочу измерить наименьшее количество увеличения температуры, вот почему я хочу использовать код. –

ответ

3

Для максимальной температуры вы хотите как можно больше транзисторов изменять состояние каждого такта. У блоков FMA с плавающей запятой есть много транзисторов; сохраняя их занятыми, выделяет много тепла, особенно для векторов AVB 256b.

например. см. раздел «стресс-тестирование» this Skylake overclocking guide, где вы можете увидеть, что Prime95 version 28 и Linpack - самые загружаемые рабочие нагрузки. Также есть таблица потребления энергии всей системы.

См. Также http://agner.org/optimize/, чтобы узнать больше о внутренностях ЦП, особенно в руководстве микроархива Агнера. Вы должны иметь возможность делать меньше или больше тепла, имея петлю, которая помещается в буфер кольцевой петли или нет. Декодеры x86 намного более энергоемкие, чем повторное использование уже декодированных uops. См. this Q&A about uop throughput for various loop sizes, для случая, когда между инструкциями нет существенных зависимостей, поэтому только граница границы ограничивает пропускную способность. (См. Также тег ).


Я сомневаюсь, что вы будете видеть очень сильно отличается в теплом от целого add reg, reg VS. mov reg, reg или что-то. Возможно, насыщение пропускной способности целого блока mul приведет к измерению разности тепла/мощности, но разная стоимость сумматора против mov или простого булева op, вероятно, будет затмевана затратами на стоимость выполнения вне порядка, отслеживающего add по трубопроводу.

Нагрузки или хранилища, в которых хранятся активные устройства кэша и хранилища, могут быть разными, но add может иметь источник памяти или dest тоже. Просто убедитесь, что вы не задерживаете свой цикл в латентности пересылки хранилища с одним добавлением к памяти.


Для получения минимального тепла, фактически не спит, использовать pause instruction в цикле. На Skylake он спит намного дольше (~ 100 циклов), чем на предыдущих микроархитектурах Intel (~ 5 циклов), IIRC.

Согласно powertop on Linux, ядро ​​использует mwait с различными подсказками для ввода разных уровней сна на процессоры Intel (например, мой рабочий стол Skylake). Вы можете сделать это из пользовательского пространства, если хотите, или использовать nanosleep для чередования сна/бодрствования и запускать тепловую рабочую нагрузку с определенным рабочим циклом.

Спящий часто может препятствовать тому, чтобы ОС перекрывала процессор до полной тактовой частоты, в зависимости от вашей настройки. Why does this delay-loop start to run faster after several iterations with no sleep?

Другие идеи по снижению пропускной способности в петле см. В разделе Deoptimizing a program for the pipeline in Intel Sandybridge-family CPUs. Стойки, которые просто медленны, не переворачивая много транзисторов для восстановления, могут быть хорошим способом сделать цикл, который не выделяет много тепла.


Без pause, вы увидите значительный нагрев от только простого бесконечного цикла, как .repeat: jmp .repeat, особенно на процессоре, который может «турбо» до высокого напряжения/частоты до тех пор, пока температурные пределы позволяют.

+0

Я думаю, что использование FMA с плавающей запятой резко увеличит температуру. С целыми числами, которые я хочу измерить как низкотемпературные изменения, как я могу. Могу ли я сделать это, имея петлю? Если есть какой-то способ? У вас есть код примера? Большое спасибо. –

+0

Тесная петля с 'add',' mov', что бы было достаточно, чтобы процессор не спал, создавая тем самым тепло. Разумеется, это не избыточная сумма, но похоже, что это тип небольшого воздействия, которое ищет OP. Трюк будет бороться с планировщиком ОС, если вы пытаетесь точно «контролировать» количество выделяемого тепла. –

+0

@ Peter Cordes @CodyGray У меня есть код стресса от Prime95, который постепенно увеличивает температуру до 20 градусов. В моем случае он идет от 40 до 80. Теперь я хочу вставить некоторые, скажем, 4 разных строки кода, которые будут приводить к небольшому отклонению в температуре по сравнению с исходным кодом, 20 раз, чтобы получить 20 разных температурных отклонений. Как и где я могу вставить эти строки 20 раз для 20 различных отклонений в температуре? благодаря –

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