Использование всех ядер снижает эффективность?

У меня есть программа (ну, php скрипт), которая выполняет довольно тяжелый текстовый поиск - она ​​загружает файлы размером 2 МБ и 40 МБ и просматривает их, чтобы найти, где каждое слово, которое появляется в первом, присутствует во втором.

У меня 4-х ядерный процессор (персональный компьютер). Когда я запускаю процесс, загрузка процессора увеличивается до 25%, загрузка 1. Я запускаю процесс, снова запускающийся в отдельном файле, а загрузка процессора увеличивается до 50%, загрузка 2. Это снижает эффективность отдельных процессов?? то есть. чтобы каждый из них занял больше времени, чем если бы они выполнялись отдельно? А что если я запустил 4 процесса, увеличив загрузку процессора до 100%? Будут ли они бежать медленнее?

Я предполагаю, что выполнение двух процессов параллельно завершится быстрее, чем если бы я запускал их последовательно, это правильно? Было бы все еще верно, если бы я побежал больше двух, скажем, 3 или 4? Или больше? Где в этом узкое место - я предполагаю, что, пока я сохраняю количество процессов равным или меньшим, чем количество ядер, процессор может справиться с этим, но как насчет доступа к памяти? Должны ли процессы ждать при чтении памяти?

4 ответа

Краткий ответ: сравните это.

Длинный ответ: Каждый отдельный процесс может занять больше времени (из-за частотного масштабирования), но в целом наиболее эффективной вещью является загрузка каждого ядра до 100%.

Многое зависит от того, что параллельный запуск улучшит производительность или ухудшит ее. Подобно:

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

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

Вообще - да. Проигнорируйте часть кодирования на мгновение.

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

Это сказало: общее количество будет все еще выше, поскольку индивидуальное повышение обычно ОЧЕНЬ мало (приблизительно сто МГц) по сравнению с получением другого ядра. Таким образом, вам действительно лучше использовать все колы. Повышение было в основном сделано для тех случаев, которые плохо масштабируются и нуждаются в высокой частоте на ядро ​​- включая однопоточные игры;)

Чтобы задать свой вопрос о доступе к памяти. Я надеюсь, что вы знаете, что современный сервер имеет скорость доступа к памяти более 50 ГБ (то есть гигабайт) в секунду из DRAM - больше из кэшей. Так что вряд ли ты ударил это. IO может быть проблемой, но это будет видно из-за того, что процессор не достигает максимума и статистика ожидания ввода-вывода повышается. Кэширование здесь очень помогает.

Похоже, вам не нужно много ждать ввода-вывода, ни на жестком диске, ни в сети. Предполагая, что у вас есть ГБ ОЗУ, файлы 42 МБ должны быть легко загружены в ОЗУ. На этом этапе четыре параллельных процесса должны дать вам лучшие результаты. Вы увидите незначительное переключение контекста, когда нужно запустить нормальные процессы ОС.

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

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