5

Интересно, может ли одновременно работать более 8 потоков на оборудовании с 8 ядрами.многопоточность (openMP) - сколько параллельных потоков

Если это так, используя openMP для распараллеливания N вычислений, я мог бы создать куски размером, скажем, N/8, и в каждом потоке дальше использовать fork (N/8)/8 потоков и, возможно, еще больше?

Как все происходит, когда я вставляю распараллеливание? у меня все еще есть 8 доступных потоков для вложенной параллели?

Спасибо!

ответ

10

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

Нижняя линия: вам необходимо измерить производительность в вашем конкретном случае в вашей конкретной среде.

См. Также this related thread.

+0

Я считаю, что чередование возможно в определенных сценариях ускоряет работу? Например, если ожидалось, что некоторые процессы закончатся? – ScarletAmaranth

+0

похоже, что моя программа быстрее (20%?), Используя вложенные параллели. Я никогда не применяю количество потоков для использования, я устанавливаю только omp_set_nested (true) – octoback

+0

@ScarletAmaranth, да. I/O является наиболее типичным примером этого (следовательно, я упомянул об этом в своем ответе), но есть и другие случаи. –

0

Прежде всего, вы не можете запустить более 8 потоков. Во-вторых, прибегайте к вложенному параллелизму, если ничто иное не работает, поскольку openmp должен многое улучшить в этом аспекте.

1

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

Таким образом, число потоков, которые могут выполняться одновременно является:
total_threads = num_procs * фактор

гиперпотокового Как правило, коэффициент гиперпотокового = 2.

Для ресурсоемких нагрузок необходимо запустить total_threads. Для интенсивной рабочей нагрузки вы должны использовать потоки total_threads * 2. Таким образом, мы можем перекрывать вычисления некоторых потоков с помощью io других потоков.

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

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