Многопоточная программа (процесс) на многоядерных процессорах с гиперпоточностью

Для многоядерных вычислений меня с самого начала смущает то, что модель многоядерного оборудования слишком абстрагирована от реальной машины.

Я работал на ноутбуке с одним процессором Intel, содержащим 4 ядра и поддерживающим гиперпоточность, что делает число логических ядер 8.

Предположим, у меня в Java- программе реализован параллельный алгоритм (сказано, что Java будет использовать правило планирования потоков ОС, поэтому JVM не повлияет на планирование), и программа чисто привязана к процессору.

Мои наблюдения:

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

Мои знания об этом: Насколько я знаю, программа, которую я запускаю, рассматривается операционной системой как пользовательский процесс, и если программа создала потоки для достижения параллелизма, ОС попытается запланировать эти потоки среди доступных ядер. Любые потоки процесса на одном и том же ядре могут совместно использовать общее время выполнения процесса на этом ядре.

Мои вопросы:предположим, что процессор только запускает мою программу. т.е. никаких других пользовательских процессов.

  • если имеется только одно ядро ​​ЦП, процесс не получит преимуществ параллелизма благодаря многопоточности, так как общее время выполнения процесса не изменится. Это правда?

  • если доступно более одного ядра, ОС будет пытаться планировать потоки процесса равномерно и справедливо на разных ядрах, а потоки процесса на разных ядрах получают свое собственное (дополнительное) время выполнения, что ускоряет процесс. Это правда?

  • если имеется n потоков и m ядер, где n>m, то какое-то ядро ​​может запустить более 1 потока процесса, что может даже повредить ускорению параллелизма из-за "переключения контекста" между потоками на одном ядре и потенциально побочный эффект потоков процесса, бегущего с различной скоростью. Это правда?

Спасибо большое!

1 ответ

Решение

если имеется только одно ядро ​​ЦП, процесс не получит преимуществ параллелизма благодаря многопоточности, так как общее время выполнения процесса не изменится. Это правда?

Только если вы на 100% связаны с процессором. Если у вас есть ожидания ввода-вывода, несколько потоков могут сильно помочь даже на одном ядре.

если доступно более одного ядра, ОС будет планировать потоки процесса равномерно и справедливо на разных ядрах.

Кажется, это зависит от усмотрения ОС. Там могут быть все виды квот и приоритетов.

может даже повредить ускорению параллелизма из-за "переключения контекста" между потоками в одном ядре

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

Другие вопросы по тегам