2013-12-15 3 views
2

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

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

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

Here're результатов ("скорость" 60/в режиме реального времени из (1)):

enter image description here

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

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

ответ

1

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

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

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


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

+0

Ну, похоже, вы пытаетесь сказать, что HT ничего не ускоряет. Но это явно неверно по определению этой технологии, а также противоречит наблюдению (см. График для потоков> 4, сравните две кривые). По моим измерениям это _effectively_ добавляет еще одно ядро, хотя физически есть только 4 настоящего - в тех случаях, когда все 8 потоков заняты работой. – Ruslan

+0

Вы правы, я интерпретировал график назад, lol, я отредактирую это. Но: график все еще демонстрирует мою общую точку, а именно, что гиперпоточность не позволяет - * не может * - увеличить общее количество доступных циклов процессора. Очевидно, что он масштабируется динамически, так что если вы запускаете 4 потока на четырехъядерном процессоре w/HT, эти 4 потока в идеале более или менее одинаковы *, как 4 нити без HT. «Идеально, более или менее» - это то, что делает разницу - идеал * в этой ситуации - 4 быстрых ядра. У вас есть 4 быстрых ядра без HT, что позволяет ему не улучшить его, но может ухудшить его. – delicateLatticeworkFever

+0

График показывает, что для гиперпоточности и для этой задачи приближенное линейное увеличение скорости, так как количество потоков увеличивается до 4, то после этого увеличивается меньшее (но все же увеличение). Я не ожидал этого эфира, но посмотрю на данные. –

2

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

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

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

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

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

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