Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

От многих вещей зависит, что параллельная работа улучшит производительность или ухудшит ее. Подобно:

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

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

В общем - да. На время проигнорируйте кодирование.

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

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

Чтобы задать свой вопрос о доступе к памяти. Надеюсь, вы знаете, что современный сервер имеет скорость доступа к памяти более 50 ГБ (то есть гигабайт) в секунду из DRAM - больше из кешей. Итак, это не похоже на то, что вы попали в это. Ввод-вывод может быть проблемой, но это будет видно, если ЦП не исчерпал максимум, а статистика ожидания ввода-вывода будет расти. Кеширование здесь очень помогает.