Подсчет времени процессора в системах HyperThreading в Linux

555
grandrew

Я пытаюсь оценить объем работы, выполняемой многопоточным приложением. Это довольно простая задача с реальными процессорами / ядрами, так как я могу просто взять процессорное время из proc, и это будет оценка того, сколько процессорного времени занимает приложение.

Но как насчет процессоров с поддержкой HT? Как отсчитывается время? Если поток просто ожидает освобождения канала процессора в случае гонки HT - считается ли он временем, проведенным в ЦП? Или, если поток может использовать 10% преимущество HT, он будет считать 10% фактического времени работы процессора?

0

1 ответ на вопрос

1
Jamie Hanrahan

Извините, но это очень не определено.

Если у вас включен HT, у вас есть два логических процессора на ядро. Если он отключен, у вас есть только один. (Это позволяет нам говорить о том, как работает планировщик, без постоянного уточнения того, что мы подразумеваем под «ЦП».) В любом случае, ОС воспринимает логический процессор как процессор, за исключением некоторых попыток оптимизации планирования * ОС не не делать что-либо еще, из-за или из-за гиперпоточности.

Со времени, когда контекст LP переключается на поток, до момента, когда он переключается на какой-то другой поток, этот поток считается полностью используемым этим потоком. ОС не может узнать, использует ли поток в LP 10% ядра, или 90% ядра, или застопорился полностью из-за того, что делает поток в другом LP. ОС просто думает, что работает.

Кроме того, HT не реализует ничего подобного приоритетам потоков. Так что, если два потока пытаются запустить в двух LP на одном ядре, и один из них в ОС имеет более высокий приоритет, чем другой, ядро ​​ничего не может с этим поделать - нет способа узнать об этом. Ядро будет обрабатывать два потока с одинаковым приоритетом и соответственно назначать ресурсы микроархитектуры.

* Оптимизация: Современные ОС знают о взаимосвязи LP с ядрами и будут пытаться, например, использовать только один LP из каждого ядра, пока потоки number_of_cores не захотят работать; два LP ядра считаются эквивалентными с точки зрения инвестиций в кэш; и т.п.

Джейми, спасибо за подробное объяснение. Насколько я понимаю, вы пытаетесь сказать, что в случае, если у меня есть `NTHREADS == NCORES` - время логического ядра ** будет фактически учитываться как время ЦП без учета фактического количества инструкций, которые он смог разделить. Таким образом, я практически увеличу удвоенное время процессора при включенной HT и, возможно, получу половину среднего FLOPS на ядро ​​(LP) в случае (полностью) честной очереди? grandrew 7 лет назад 0
Q1: да, хотя я не понимаю вашу фразу о «инструкциях, которыми она могла поделиться» - чем бы вы поделились в этой ситуации? Q2: Да, с включенным HT и `NTHREADS == 2xNCORES` вы увидите 2-кратное использованное процессорное время, но не 2-кратную работу. 3-е: если FP-модуль ядра был вашим узким местом, когда HT был отключен, то с HT и двумя потоками на ядро ​​общая работа FP была бы примерно такой же, как с одним потоком на ядро, но каждый поток получал бы только половину FP thruput. Тем не менее, производительность FP также зависит от других вещей, кроме модуля FP (например, доступ к памяти), так что это не обязательно. Jamie Hanrahan 7 лет назад 0
На мой взгляд, когда два потока конкурируют за время одного ядра в процессоре HT - потоки могут «разделять» часть ядра, вместо того, чтобы ждать освобождения ядра - в случае, если ядро ​​обнаружит, что ему есть чем поделиться с другим ( ожидающий) поток при выполнении первого потока. grandrew 7 лет назад 0
Ну ... нет понятия "первый поток", то есть ни один из LP не имеет приоритета. Микропрограмма пытается запланировать ресурсы ядра, чтобы позволить обоим LP добиться прогресса. Jamie Hanrahan 7 лет назад 0

Похожие вопросы