У меня есть программа (точнее, PHP-скрипт), которая выполняет довольно сложный поиск текста — она загружает файлы размером 2 МБ и 40 МБ и просматривает их, чтобы найти, где каждое слово, встречающееся в первом файле, встречается во втором.
У меня 4-ядерный процессор (персональный компьютер). Когда я запускаю процесс, загрузка процессора подскакивает до 25%, загрузка 1. Я снова запускаю процесс в отдельном файле, и загрузка процессора подскакивает до 50%, загрузка 2. Снижает ли это эффективность отдельных процессов? т. е. заставляет каждый из них выполняться дольше, чем если бы они запускались по отдельности? А что, если я запущу 4 процесса, доведя загрузку процессора до 100%? Будут ли они тогда работать медленнее?
Я предполагаю, что запуск двух процессов параллельно завершится быстрее, чем если бы я запустил их последовательно, это верно? Будет ли это по-прежнему верно, если я запущу больше двух, скажем, 3 или 4? Или больше? Где здесь узкое место — я предполагаю, что пока я сохраняю количество процессов равным или меньшим количества ядер, то процессор может с этим справиться, но что насчет доступа к памяти? Должны ли будут процессы ждать, считывая память?
решение1
Короткий ответ: проведите сравнительный анализ.
Подробный ответ: для завершения каждого отдельного процесса потребуется больше времени (из-за масштабирования частоты), но в целом наиболее эффективно загружать каждое ядро на 100%.
решение2
Это зависит от многих факторов: улучшит ли параллельная работа производительность или ухудшит ее. Например:
- Если вы выполняете много операций ввода-вывода, используя для сравнения большие файлы, то узким местом будет диск, а не процессор, и ваша производительность наверняка снизится.
- В то же время, если ваши файлы достаточно велики для оперативной памяти вашей системы, и вы запускаете более одного процесса, то узким местом будет оперативная память, и снова на машине будет ввод-вывод.
Итак, это относится к каждому конкретному случаю. Но в вашем случае я почти уверен, что ваша производительность улучшится только если вы будете выполнять все параллельно, и я не вижу сценария, в котором это может ухудшить вашу эффективность, если только я не упускаю какой-то момент, который я не могу придумать.
решение3
Похоже, что у вас не так много ожидания ввода-вывода, ни на жестком диске, ни в сети. Если у вас есть ГБ ОЗУ, файлы размером 42 МБ должны легко загружаться в ОЗУ. На этом этапе четыре параллельных процесса должны дать вам наилучшие результаты. Вы увидите незначительное переключение контекста, когда необходимо запустить обычные процессы ОС.
В системах NUMA каждому ядру назначен пул памяти. Производительность может снизиться, когда ядро переносит процесс на другое ядро, поскольку файлы все еще находятся в пуле памяти исходного ядра. Честно говоря, я не уверен, что это применимо к персональным компьютерам.
решение4
В общем - да. Проигнорируйте на минутку часть с кодированием.
Современные многоядерные процессоры имеют режим повышения частоты, если используется только небольшое количество ядер, что немного повышает частоту. Таким образом, использование всех ядер делает отдельное ядро меньше. Детали зависят от процессора.
ЧТО СКАЗАЛ: Общая сумма все равно будет выше, так как индивидуальный прирост обычно ОЧЕНЬ мал (около сотни МГц) по сравнению с получением еще одного ядра. Таким образом, вам действительно лучше использовать все ядра. Прирост был сделан в основном для тех случаев, которые плохо масштабируются и требуют высокой частоты на ядро - включая однопоточные игры ;)
Чтобы задать вопрос о доступе к памяти. Надеюсь, вы знаете, что современный сервер имеет скорость доступа к памяти более 50 ГБ (то есть гигабайт) в секунду из DRAM — больше из кэшей. Так что маловероятно, что вы столкнетесь с этим. IO может быть проблемой, но это будет видно по тому, что CPU не будет работать на пределе возможностей, а статистика ожидания IO будет расти. Кэширование здесь очень помогает.