36

Мне интересно, каково теоретическое ускорение от гиперпоточных процессоров. Предполагая 100% распараллеливание и 0 коммуникаций - два процессора дадут ускорение 2. А как насчет сверхпоточного процессора?

4 ответа4

58

Как уже говорили другие, это полностью зависит от задачи.

Чтобы проиллюстрировать это, давайте посмотрим на реальный тест:

Это было взято из моей магистерской диссертации (в настоящее время недоступно онлайн).

Это показывает относительное ускорение 1 алгоритмов сопоставления строк (каждый цвет - это отдельный алгоритм). Алгоритмы были выполнены на двух четырехъядерных процессорах Intel Xeon X5550 с гиперпоточностью. Другими словами: всего было восемь ядер, каждое из которых может выполнять два аппаратных потока (= «гиперпотоки»). Таким образом, тест производительности тестирует ускорение до 16 потоков (это максимальное количество одновременных потоков, которые может выполнить эта конфигурация).

Два из четырех алгоритмов (синий и серый) масштабируются более или менее линейно по всему диапазону. То есть он извлекает выгоду из гиперпоточности.

Два других алгоритма (красный и зеленый; неудачный выбор для дальтоников) линейно масштабируются до 8 потоков. После этого они застаиваются. Это ясно указывает на то, что эти алгоритмы не выигрывают от гиперпоточности.

Причина? В данном конкретном случае это загрузка памяти; первые два алгоритма требуют больше памяти для расчетов и ограничены производительностью шины основной памяти. Это означает, что пока один аппаратный поток ожидает память, другой может продолжить выполнение; основной вариант использования для аппаратных потоков.

Другие алгоритмы требуют меньше памяти и не должны ждать шины. Они почти полностью связаны с вычислениями и используют только целочисленную арифметику (фактически, битовые операции). Следовательно, нет возможности для параллельного выполнения и нет пользы от параллельных конвейеров инструкций.


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

18

Проблема в том, что это зависит от задачи.

Идея гиперпоточности заключается в том, что все современные процессоры имеют более одной проблемы с выполнением. Обычно ближе к дюжине или около того сейчас. Делится на Integer, с плавающей точкой, SSE/MMX/Streaming (как бы это ни называлось сегодня).

Кроме того, каждая единица имеет разные скорости. Т.е. Для обработки чего-либо может потребоваться целочисленный математический блок 3-го цикла, но 64-разрядное деление с плавающей запятой может занять 7 циклов. (Это мифические цифры, не основанные ни на чем).

Внеочередное исполнение помогает во многих отношениях поддерживать как можно более полные единицы.

Однако ни одна задача не будет использовать каждую единицу выполнения каждый момент. Даже разделение потоков не может помочь полностью.

Таким образом, теория состоит в том, чтобы притворяться, что есть второй ЦП, другой поток может работать на нем, используя доступные неиспользуемые исполнительные модули, скажем, ваше транскодирование аудио, которое на 98% состоит из SSE/MMX, а модули int и float полностью простаивает, за исключением некоторых вещей.

На мой взгляд, это имеет больше смысла в мире с одним ЦП, поскольку имитация второго ЦП позволяет потокам легче преодолевать этот порог с небольшим (если вообще) дополнительным кодированием для обработки этого поддельного второго ЦП.

В мире ядра 3/4/6/8 с процессорами 6/8/12/16 это помогает? Не знаю. Столько? Зависит от поставленных задач.

Таким образом, чтобы фактически ответить на ваши вопросы, это будет зависеть от задач в вашем процессе, какие исполнительные блоки он использует, и в вашем ЦП, какие исполнительные блоки простаивают / недоиспользуются и доступны для этого второго поддельного ЦП.

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

5

У меня есть несколько неопровержимых доказательств, которые я могу добавить к ответу geoffc: у меня фактически есть процессор Core i7 (4-ядерный) с гиперпоточностью, и я немного поиграл с транскодированием видео, что является задачей, требующей определенного объема связи и синхронизации, но достаточной параллелизм, что вы можете эффективно полностью загрузить систему.

Мой опыт работы с тем, сколько процессоров назначено для задачи, обычно с использованием 4-х сверхпоточных "дополнительных" ядер, эквивалентно эквивалентной примерно 1 дополнительной вычислительной мощности процессора. Дополнительные 4 "гиперпоточных" ядра добавили примерно такую же полезную вычислительную мощность, что и переход от 3 до 4 "реальных" ядер.

Конечно, это не совсем честный тест, поскольку все потоки кодирования, вероятно, будут конкурировать за одни и те же ресурсы в ЦП, но для меня это действительно показало, по крайней мере, незначительное увеличение общей вычислительной мощности.

Единственный реальный способ показать, действительно ли это действительно помогает, - это запустить несколько разных тестов типа Integer/Floating Point/SSE одновременно в системе с включенной и отключенной гиперпоточностью и посмотреть, сколько вычислительной мощности доступно в управляемой среда.

3

Это сильно зависит от процессора и рабочей нагрузки, как говорили другие.

Intel говорит:

Измеренная производительность на процессоре Intel® Xeon® MP с технологией Hyper-Threading демонстрирует увеличение производительности до 30% по сравнению с обычными тестами серверных приложений для этой технологии.

(Мне это кажется немного консервативным.)

И есть еще одна более длинная статья (которую я еще не прочитал) с большим количеством номеров здесь. Один интересный вывод из этой статьи заключается в том, что гиперпоточность может замедлить работу некоторых задач.

Архитектура AMD Bulldozer может быть интересной. Они описывают каждое ядро как эффективно 1,5 ядра. Это своего рода экстремальная гиперпоточность или нестандартный многоядерный процесс, в зависимости от того, насколько вы уверены в его возможной производительности. Числа в этой части предполагают ускорение комментариев от 0,5x до 1,5x.

Наконец, производительность также зависит от операционной системы. Надеемся, что ОС будет отправлять процессы на реальные процессоры, отдавая предпочтение гиперпотокам, которые просто маскируются под процессоры. В противном случае в двухъядерной системе у вас может быть один простаивающий процессор и одно очень загруженное ядро с двумя процессорами. Кажется, я вспоминаю, что это случилось с Windows 2000, хотя, конечно, все современные ОС способны на это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .