Затраты на параллелизацию Intel TBB - PullRequest
4 голосов
/ 22 июля 2011

Почему у Intel Threading Building Blocks (TBB) parallel_for такие большие издержки?Согласно разделу 3.2.2 Автоматическое разбиение на блоки в Tutorial.pdf составляет около половины миллисекунды.Это пример из учебника:

ПРЕДУПРЕЖДЕНИЕ. Как правило, циклу требуется не менее миллиона тактовых циклов для параллельного_для повышения его производительности.Например, параллель для цикла может занять не менее 500 мкс на процессоре с частотой 2 ГГц.

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

Так что же занимает время?Синхронизация данных с использованием мьютексов разве не так медленна, верно?Кроме того, не использует ли TBB структуры данных без блокировки для синхронизации?

1 Ответ

11 голосов
/ 22 июля 2011

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

Да, TBB предварительно выделяет потоки.Он не создает физически и не присоединяется к рабочим потокам всякий раз, когда видит parallel_for.OpenMP и другие параллельные библиотеки выполняют предварительное выделение ресурсов.

Но все еще есть издержки для пробуждения потоков из пула и отправки логических задач потокам.Да, TBB использует структуры данных без блокировки для минимизации накладных расходов, но все же требует некоторого количества параллельных накладных расходов (т. Е. Последовательной части).Вот почему руководство TBB советует избегать очень коротких циклов.

В общем, у вас должно быть достаточно работы, чтобы получить параллельное ускорение.Я думаю, что даже 1 миллисекунда (= 1000 микросекунд) слишком мала.Исходя из моего опыта, чтобы увидеть значимое ускорение, мне нужно было увеличить время выполнения примерно на 100 миллисекунд.

Если параллельные издержки TBB parallel_for действительно вас беспокоят, возможно, стоит попробоватьпростое статическое планирование.У меня нет хороших знаний о реализации статического планирования TBB.Но вы можете легко примерить OpenMP: omp parallel for schedule(static).Я считаю, что эти накладные расходы были бы минимальной параллельной стоимостью.Однако, поскольку он использует статическое планирование, выгода от динамического планирования (особенно когда рабочие нагрузки неоднородны) будет потеряна.

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