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

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

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

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

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

решение1

Короткий ответ: проведите сравнительный анализ.

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

решение2

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

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

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

решение3

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

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

решение4

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

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

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

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

Связанный контент