Почему истекшее время увеличивается, а количество ядер увеличивается?

Я делаю многоядерные вычисления в R. Я

Вот код и выходные данные для каждого вычисления. Почему истекшее время увеличивается с увеличением количества ядер? Это действительно нелогично. Я думаю, что разумно, что истекшее время уменьшается с увеличением количества ядер. Есть ли способ это исправить?

Вот код:

library(parallel)
detectCores()
system.time(pvec(1:1e7, sqrt, mc.cores = 1))
system.time(pvec(1:1e7, sqrt, mc.cores = 4))
system.time(pvec(1:1e7, sqrt, mc.cores = 8))

Спасибо.

1 ответ

Решение

Предположим, что ваши данные разделены на N частей. Каждая часть ваших данных рассчитывается в T секунд. В одноядерной архитектуре вы ожидаете, что все операции будут выполнены за N x T секунд. Вы также надеетесь, что все работы должны быть выполнены в T раз на машине с N ядрами. Однако в параллельных вычислениях существует задержка связи, которая потребляется каждым отдельным ядром (инициализация, передача данных от основного к дочернему, вычисления, передача результата и финализация). Теперь пусть коммуникационная задержка составляет C секунд и для простоты она постоянна для всех ядер. Таким образом, в машине с N ядрами расчеты должны выполняться в

Т + Н х С

секунд, в которых часть T предназначена для вычислений, а часть N X C - для общего обмена данными. Если мы сравним это с одноядерным компьютером, неравенство

(Н х Т) > (Т + Н х С)

должно быть удовлетворено, чтобы получить время вычисления, по крайней мере, для наших предположений. Если мы упростим неравенство, мы можем получить

C <(N x T - T) / N

Итак, если постоянное время связи не меньше, чем отношение (N x T - T) / N, у нас нет никакой выгоды, чтобы сделать это вычисление параллельным.

В вашем примере время, необходимое для создания, расчета и связи, больше, чем одноядерное вычисление для функции sqrt.

Другие вопросы по тегам