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