Увеличение количества рабочих - потеря производительности - PullRequest
2 голосов
/ 09 мая 2020

, если я наберу lscpu в командной строке:

CPU(s):              4
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1

, то есть у меня 2 физических ядра.

У меня нет опыта параллельных вычислений, но он мне нужен для мои цели. Итак, поскольку я являюсь пользователем MatLab, меня интересуют parfor циклы, но мне нужно понимать, что на самом деле происходит.

Я написал красный из документации MatLab, это номер по умолчанию рабочих процессов - по одному на физическое ядро ​​ЦП с использованием одного вычислительного потока , а также этот выбор оптимизирует производительность. Я хочу понять, как количество рабочих влияет на производительность:

Чтобы убедиться в этом, я попытался запустить (вдохновленный this ) следующий стандартный фрагмент кода, изменив число рабочих в строке parpool.

m = 500;
A = randn(m);
N  = 200;
parpool(1); 
tic
x = zeros(1,N);
parfor i=1:N
    x(i) = max(abs(eig(A)));
end
toc

и я измеряю с ti c -to c затраченное время.

С 1 рабочим: % Elapsed time is 26.534430 seconds.

С 2 рабочими: % Elapsed time is 14.528462 seconds.

С 3 рабочими: % Elapsed time is 14.403359 seconds.

С 4 рабочими: % Elapsed time is 17.946775 seconds.

Если I go включен с рабочие, это занимает больше времени.

У меня два вопроса:

  1. Я ожидал бы лучшей производительности с двумя рабочими: почему с 3 рабочими У меня все еще хорошие результаты?

  2. Почему больше рабочих подразумевает больше времени?

1 Ответ

2 голосов
/ 10 мая 2020

Прирост скорости не является линейным ( удвоить количество рабочих, поэтому половина вычислительного времени требуется равно неверно ). Это связано с (почти) постоянными накладными расходами, при которых базовый планировщик должен разбить проблему на части и организовать распределение - и в конечном итоге снова присоединить результаты. Таким образом, вы получите прибыль. Взгляните на закон Густафсона в Википедии .

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

Тем не менее, (почти) всегда есть улучшение, если вы переключитесь на parpool - вопрос в том, стоит ли оно того .. .

Кстати, в гиперпоточности нет никаких преимуществ, поскольку MATLAB просто не использует ее. Если он занимает центральный процессор вычислениями, нет никакого преимущества в регистрации второго потока, который также хочет выполнять вычисления на этом процессоре ...

Теперь, в вашем конкретном случае: у вас есть максимум четыре рабочих. Однако, если вы используете все четыре, ваша система может зависнуть. Кроме того, фоновые задачи системы с более высоким приоритетом не могут быть обойдены вашими вычислениями на платной основе, поэтому вычисления будут прерваны. Поэтому маловероятно, что это оптимальная настройка для вашего parpool - я бы рекомендовал всегда использовать по максимуму одно ядро.

Все это не зависит от вопроса, разумно ли это количество тестов для статистического подтверждения результатов.

...