Двухъядерный Hyperthreading: я должен использовать 4 потока или 3 или 2? - PullRequest
15 голосов
/ 23 января 2011

Если вы порождаете несколько потоков (или процессов) одновременно, то лучше порождать столько, сколько физических процессоров или количество логических процессоров, предполагая, что задача связана с процессором? Или лучше сделать что-то промежуточное (скажем, 3 темы)?

Зависит ли производительность от вида выполняемых инструкций (скажем, будет ли нелокальный доступ к памяти сильно отличаться от попаданий в кэш)? Если да, то в каких случаях лучше использовать гиперпоточность?


Обновление:

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

Ответы [ 6 ]

5 голосов
/ 23 января 2011

Производительность зависит от огромного разнообразия факторов.Большинство задач не связаны строго с процессором, поскольку, даже если все данные находятся в памяти, они обычно не находятся в кэш-памяти процессора.Я видел примеры (например, этот ), в которых шаблоны доступа к памяти могут существенно изменить профиль производительности данного «параллельного» процесса..

4 голосов
/ 23 января 2011

Скорее всего, вы увидите улучшение производительности при работе 2 потоков на ядро ​​с включенной функцией HyperThreading.Задания, которые кажутся полностью привязанными к процессору, обычно не являются таковыми, и HyperThreading может извлечь несколько «лишних» циклов из случайного прерывания или переключения контекста.

С другой стороны, с процессором Core iX, имеющим Turbo Boost, вы могли бы на самом деле лучше запустить 1 поток на ядро, чтобы заставить процессор разогнать себя.

На работе мы обычнозапускать многоядерные серверы с полной загрузкой процессора, выполняя различные виды вычислений по днямНекоторое время назад мы измерили разницу в производительности с и без HT.Мы обнаружили, что в среднем с HyperThreading и одновременным выполнением в два раза больше заданий мы можем выполнить то же количество заданий примерно на 10% быстрее, чем без HyperThreading.

Предположим, что 2х ядер - это хорошее место для начала, , но суть: мера!

2 голосов
/ 19 января 2012

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

С другой стороны, в некоторых ситуациях гиперпоточность может быть огромным выигрышем. Если все потоки будут считывать и записывать одни и те же общие данные, используя структуры данных без блокировки, и все потоки должны видеть непротиворечивое представление данных, попытка запустить потоки на непересекающемся процессоре может вызвать перегрузку, поскольку одновременно может работать только один процессор. иметь доступ на чтение и запись к любой заданной строке кэша; запуск таких потоков на двух ядрах может занять больше времени, чем запуск только по одному за раз. Однако такой кэш-арбитраж не требуется, когда к фрагменту данных обращаются несколько потоков в одном ядре. В таких случаях гиперпоточность может стать огромным выигрышем.

К сожалению, я не знаю никакого способа дать планировщику какие-либо «подсказки», чтобы предположить, что некоторые потоки должны совместно использовать ядро, когда это возможно, в то время как другие должны работать отдельно, когда это возможно.

2 голосов
/ 23 января 2011

Я помню информацию, что гиперпоточность может дать вам до 30% прироста производительности. в общем, вам лучше относиться к ним как к 4 различным ядрам. конечно, в некоторых конкретных обстоятельствах (например, имея одну и ту же долгосрочную задачу, связанную с каждым ядром), вы можете лучше разделить свою обработку, принимая во внимание, что некоторые ядра являются просто логическими

больше информации о самой гиперпоточности здесь

1 голос
/ 12 декабря 2013

HT позволяет повысить примерно на 10-30% для , в основном задач, связанных с процессором, которые используют дополнительные виртуальные ядра. Хотя эти задачи могут показаться ограниченными процессором, если они не являются сборкой, выполненной на заказ, они обычно страдают от ожидания ввода-вывода между оперативной памятью и локальным кэшем. Это позволяет одному потоку, работающему на физическом ядре с поддержкой HT, работать, пока другой поток ожидает ввода-вывода. Это, однако, имеет недостаток, поскольку два потока совместно используют один и тот же кэш / шину, что приведет к меньшему количеству ресурсов в каждом, что может привести к паузе в обоих потоках во время ожидания ввода-вывода.

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

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

Поскольку каждая программа имеет разные характеристики использования ЦП, а перегрузка кеша может или не может быть серьезным замедлением (как это обычно бывает), невозможно определить, какое идеальное количество потоков должно быть без предварительного профилирования. И последнее, на что следует обратить внимание, это то, что ОС / ядру также потребуются некоторые ресурсы ЦП и кеша. Как правило, рекомендуется хранить одно (физическое) ядро ​​отдельно для ОС, если в потоках, связанных с процессором, требуется задержка в реальном времени, чтобы избежать совместного использования ресурсов кэша / процессора. Если потоки часто ожидают ввода-вывода и перегрузка кэша не является проблемой, или если запущена ОС реального времени, специально предназначенная для приложения, вы можете пропустить этот последний шаг.

http://en.wikipedia.org/wiki/Thrashing_(computer_science) http://en.wikipedia.org/wiki/Processor_affinity

0 голосов
/ 19 января 2012

Все остальные ответы уже дают много отличной информации.Но еще один момент, который следует учитывать, заключается в том, что SIMD-блок используется совместно логическими ядрами на одном кристалле.Итак, если вы запускаете потоки с кодом SSE, запускаете ли вы их на всех 4 логических ядрах или просто порождаете 2 потока (при условии, что у вас есть два чипа)?Для этого странного случая лучше всего подать заявку в своем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...