Для максимальной температуры вы хотите как можно больше транзисторов изменять состояние каждого такта. У блоков 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, для случая, когда между инструкциями нет существенных зависимостей, поэтому только граница границы ограничивает пропускную способность. (См. Также тег x86).
Я сомневаюсь, что вы будете видеть очень сильно отличается в теплом от целого 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
, особенно на процессоре, который может «турбо» до высокого напряжения/частоты до тех пор, пока температурные пределы позволяют.
Отредактировано ваше название, чтобы люди не были введены в заблуждение «злыми». Если вам нужна «контролируемая теплогенерация», используйте метод обратной связи. Возможно, вам не понадобится asm. – Jester
Подождите минуту «проверьте влияние температуры на производительность?» Почему вы пишете свой собственный код для этого? Почему бы вам просто не использовать prime95, чтобы вызвать термическое дросселирование, как обычный человек? Я не заметил, что часть ответа «проверить влияние на производительность» во время ответа, так как вы даже не упомянули об этом в теле вопроса. –
Спасибо @PeterCordes. Для моего проекта я должен это сделать. И потому что я хочу измерить наименьшее количество увеличения температуры, вот почему я хочу использовать код. –