Перейти к содержимому

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

0

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

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

727 просмотров
grandrew спросил 10 лет назад
G 138

1 ответ

1
Принятый ответ

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

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

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

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

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

Джейми, спасибо за подробное объяснение. Насколько я понимаю, вы пытаетесь сказать, что в случае, если у меня есть NTHREADS == NCORES - время логического ядра ** будет фактически учитываться как время ЦП без учета фактического количества инструкций, которые он смог разделить. Таким образом, я практически увеличу удвоенное время процессора при включенной HT и, возможно, получу половину среднего FLOPS на ядро ​​(LP) в случае (полностью) честной очереди?

grandrew · 10 лет назад · 0

Q1: да, хотя я не понимаю вашу фразу о «инструкциях, которыми она могла поделиться» - чем бы вы поделились в этой ситуации? Q2: Да, с включенным HT и NTHREADS == 2xNCORES вы увидите 2-кратное использованное процессорное время, но не 2-кратную работу. 3-е: если FP-модуль ядра был вашим узким местом, когда HT был отключен, то с HT и двумя потоками на ядро ​​общая работа FP была бы примерно такой же, как с одним потоком на ядро, но каждый поток получал бы только половину FP thruput. Тем не менее, производительность FP также зависит от других вещей, кроме модуля FP (например, доступ к памяти), так что это не обязательно.

Jamie Hanrahan · 10 лет назад · 0

На мой взгляд, когда два потока конкурируют за время одного ядра в процессоре HT - потоки могут «разделять» часть ядра, вместо того, чтобы ждать освобождения ядра - в случае, если ядро ​​обнаружит, что ему есть чем поделиться с другим ( ожидающий) поток при выполнении первого потока.

grandrew · 10 лет назад · 0

Ну ... нет понятия "первый поток", то есть ни один из LP не имеет приоритета. Микропрограмма пытается запланировать ресурсы ядра, чтобы позволить обоим LP добиться прогресса.

Jamie Hanrahan · 10 лет назад · 0
Jamie Hanrahan ответил 10 лет назад
J 17 264