Почему производительность параллельной компиляции с HT хуже, чем без него?

Я сделал несколько измерений времени компиляции вина с включенной и отключенной HyperThreading в BIOS на моем Core i7 930 @ 2,8 ГГц (четырехъядерный) в Linux 2.6.39 x86_64. Каждое измерение было таким:

git clean -xdf
./configure --prefix=/usr
time make -j$N

где N - это число от 1 до 8.

Вот результаты («скорость» 60 / реальное время (1)):

введите описание изображения здесь

Здесь синяя линия соответствует отключенному HT, а фиолетовая - включенному HT. Похоже, что когда HT включен, использование 1-4 потоков медленнее, чем без HT. Я предполагаю, что это может быть связано с тем, что ядро ​​не распределяет процессы по разным ядрам и повторно использует вторые потоки уже занятых ядер.

Итак, мой вопрос: как я могу заставить ядро ​​отдавать одному процессу на одно ядро ​​планирование более высокого приоритета, чем добавление большего количества процессов в другой поток того же ядра? Или, если мои рассуждения неверны, как я могу добиться производительности с HT не хуже, чем без HT, для 1-4 процессов, работающих параллельно?


person Ruslan    schedule 15.12.2013    source источник


Ответы (2)


Гиперпоточность на чипах Intel реализована как дублирование некоторых элементов физического ядра, но без достаточного количества электроники, чтобы быть независимым ядром (например, они могут совместно использовать декодер инструкций, но я не могу вспомнить особенности реализации Intel).

Представьте физическое ядро ​​с HT как 1,5 физических ядра, которое ваша ОС видит как 2 реальных ядра. Это не соответствует скорости в 1,5 раза (это может варьироваться в зависимости от варианта использования).

В вашем примере non-HT работает быстрее до 4 потоков, потому что ни одно из ядер не разделяет работу со своим конвейером HT. Вы видите плоскую линию над 4 потоками, потому что теперь у вас есть только 4 потока выполнения, и вы получаете небольшую дополнительную нагрузку на переключение контекста между потоками.

В примере HT вы немного медленнее до 4 потоков, вероятно, потому, что некоторые из этих потоков назначаются реальному ядру, а это HT, поэтому вы теряете производительность, поскольку эти два потока выполнения совместно используют физические ресурсы. Выше 4 потоков вы видите преимущество дополнительных потоков выполнения, но вы видите начало убывающей отдачи.

Вероятно, вы могли бы сопоставить производительность в обоих случаях до 4 потоков, но, вероятно, не с заданием компиляции. Я думаю, что многие процессы создаются для привязки к процессору. Если бы вы вместо этого запускали реальное параллельное задание с использованием OpenMP или MPI с X ‹= 4 потоками, привязанными к конкретным реальным ядрам ЦП, я думаю, вы бы увидели аналогичную производительность между HT-off и -on.

person casey    schedule 15.12.2013
comment
Еще одна вещь, которую следует добавить к этому, заключается в том, что HyperThreading допускает несколько потоков на ядро ​​и, вероятно, вызывает проблемы с конкуренцией в кеш-памяти. Скорее всего, другие потоки (возможно, МНОГО, если вы потребляете все ядра и у вас много фоновых процессов, например, если у вас работает X Server), планируются на том же физическом ядре и вытесняют тонну строк кэша компилятора. (В противном случае очень красивое объяснение). - person CrazyCasta; 09.11.2019

Учитывая количество потоков ‹= количество реальных ядер, использование HT должно быть медленнее, потому что (грубо говоря) вы потенциально сокращаете скорость ваших ядер вдвое. 1

Имейте в виду, что обычно больше ядер НЕ лучше, чем более БЫСТРЫЕ ядра. Фактически, единственная причина, по которой так много работы было вложено в разработку многоядерных систем, заключается в том, что становилось все труднее создавать более быстрые и быстрые. . Так что, если у вас не может быть процессора с частотой 20 ГГц, вам потребуется процессор 8 x 3 ГГц.

Я считаю, что HT в первую очередь предназначен как преимущество в контекстах, где каждый поток не обязательно поглощает столько процессора, сколько может; он выполняет какую-то конкретную задачу, которая регулируется взаимодействием с пользователем, например, элементы САПР, видеоигры и т. д .; это те приложения, которые выигрывают от многозадачности. Напротив, серверные платформы, на которых основные приложения обычно выполняют независимые от потоков задачи, которые не зависят от чего-либо еще и поэтому оптимально выполняются как можно быстрее, не получают непосредственной выгоды от использования нескольких -задача; им выгодна скорость. make находится в той же категории, хотя, возможно, с большей степенью взаимозависимости между потоками, поэтому вы видите преимущество HT от 4-8 потоков.


1. Это упрощение. HT не просто удваивает количество ядер и вдвое снижает их скорость, но какая бы динамика ни использовалась, общее количество циклов процессора в секунду для системы не улучшается. То же самое, только более фрагментированное.

person CodeClown42    schedule 15.12.2013
comment
Ну вы вроде как хотите сказать, что HT ничего не ускоряет. Но это явно неверно по определению этой технологии, а также противоречит наблюдению (см. График для потоков ›4, сравните две кривые). По моим измерениям, он эффективно добавляет еще одно ядро, хотя физически их всего 4 - в случаях, когда все 8 потоков заняты работой. - person Ruslan; 16.12.2013
comment
Вы правы, я интерпретировал график в обратном порядке, лол, я отредактирую это. Но: график все еще демонстрирует мою общую точку зрения, заключающуюся в том, что гиперпоточность не - не может - увеличивать общее количество доступных циклов процессора. Очевидно, что он динамически масштабируется, так что если вы запускаете 4 потока на четырехъядерном процессоре с HT, эти 4 потока, в идеале, более или менее совпадают с 4 потоками без HT. В идеале большая или меньшая разница - вот в чем разница - идеальный в этой ситуации - это 4 быстрых ядра. У вас есть 4 быстрых ядра без HT, что не может улучшить ситуацию, но может ухудшить ситуацию. - person CodeClown42; 16.12.2013
comment
График показывает для гиперпоточности и для этой задачи приблизительное линейное увеличение скорости по мере увеличения числа потоков до 4, а затем меньшее увеличение после этого (но все же увеличение). Не ожидал такого эфира, но посмотрите данные. - person ctrl-alt-delor; 16.12.2013
comment
Извините, но вы совсем не понимаете HT. Использование HT с ‹= количеством реальных ядер малоэффективно, потому что, если ядро ​​не умерло, лучше всего будет распределить тяжелую рабочую нагрузку по ядрам. Замедление, вероятно, связано с некоторой комбинацией того, что ядро ​​не совсем понимает это, и конфликты с кешем. Ваша концепция циклов в секунду - ерунда, ее не существовало на платформе x86 со времен Pentium Pro и вообще с 60-х годов. Практически все современные процессоры выполняют несколько инструкций параллельно (ILP в 1 потоке, а не в ядрах). HT - это, по сути, всего два потока, использующие ILP. - person CrazyCasta; 09.11.2019