Многопоточная программа (процесс) на многоядерных процессорах с гиперпоточностью
Для многоядерных вычислений меня с самого начала смущает то, что модель многоядерного оборудования слишком абстрагирована от реальной машины.
Я работал на ноутбуке с одним процессором Intel, содержащим 4 ядра и поддерживающим гиперпоточность, что делает число логических ядер 8.
Предположим, у меня в Java- программе реализован параллельный алгоритм (сказано, что Java будет использовать правило планирования потоков ОС, поэтому JVM не повлияет на планирование), и программа чисто привязана к процессору.
Мои наблюдения:
- если в программе (процессе) запущено менее 8 потоков, параллелизм работы возрастает с увеличением числа потоков
- когда общее число потоков превышает 8, производительность усложняется, но обычно улучшение не улучшается по сравнению с выполнением 8 потоков; и для некоторого определенного алгоритма это намного хуже, то есть потребление времени значительно увеличилось, чем выполнение 8 потоков.
Мои знания об этом: Насколько я знаю, программа, которую я запускаю, рассматривается операционной системой как пользовательский процесс, и если программа создала потоки для достижения параллелизма, ОС попытается запланировать эти потоки среди доступных ядер. Любые потоки процесса на одном и том же ядре могут совместно использовать общее время выполнения процесса на этом ядре.
Мои вопросы:предположим, что процессор только запускает мою программу. т.е. никаких других пользовательских процессов.
если имеется только одно ядро ЦП, процесс не получит преимуществ параллелизма благодаря многопоточности, так как общее время выполнения процесса не изменится. Это правда?
если доступно более одного ядра, ОС будет пытаться планировать потоки процесса равномерно и справедливо на разных ядрах, а потоки процесса на разных ядрах получают свое собственное (дополнительное) время выполнения, что ускоряет процесс. Это правда?
если имеется n потоков и m ядер, где n>m, то какое-то ядро может запустить более 1 потока процесса, что может даже повредить ускорению параллелизма из-за "переключения контекста" между потоками на одном ядре и потенциально побочный эффект потоков процесса, бегущего с различной скоростью. Это правда?
Спасибо большое!
1 ответ
если имеется только одно ядро ЦП, процесс не получит преимуществ параллелизма благодаря многопоточности, так как общее время выполнения процесса не изменится. Это правда?
Только если вы на 100% связаны с процессором. Если у вас есть ожидания ввода-вывода, несколько потоков могут сильно помочь даже на одном ядре.
если доступно более одного ядра, ОС будет планировать потоки процесса равномерно и справедливо на разных ядрах.
Кажется, это зависит от усмотрения ОС. Там могут быть все виды квот и приоритетов.
может даже повредить ускорению параллелизма из-за "переключения контекста" между потоками в одном ядре
Это правда, что накладные расходы связаны с управлением дополнительными потоками (не только на уровне планирования, но также с синхронизацией и связью внутри вашего приложения), и если эти потоки не могут продуктивно использовать иные незанятые ядра ЦП, то на самом деле меньшее количество потоков может фактически улучшить производительность.