Какие накладные расходы на различные формы parallelism в Julia v0.5?

Как говорится в заголовке, каковы накладные расходы на различные формы parallelism, по крайней мере, в текущей реализации Julia (v0.5, если реализация в будущем кардинально изменится)? Я ищу некоторые "практические меры", некоторые общие эвристики или ballparks, чтобы держать в голове, когда это может быть полезно. Например, довольно очевидно, что многопроцессорность не даст вам прироста в цикле, например:

addprocs(4)
@parallel (+) for i=1:4
  rand()
end

не дает вам прироста производительности, потому что каждый процесс принимает только одно случайное число, но существует ли общая эвристика, чтобы знать, когда это будет полезно? Кроме того, как насчет эвристики для потоковой передачи. Это, конечно, более низкая нагрузка, чем многопроцессорность, но, например, с 4 потоками, для чего N - хорошая идея для многопоточности:

A = rand(4)
[email protected] (+) for i = 1:N
  A[i%4+1] 
end

(Я знаю, что сейчас нет нисходящего сокращения, но давайте действовать, как есть, или отредактируйте с лучшим примером). Конечно, я могу сравнить каждый пример, но некоторые хорошие правила, которые следует иметь в виду, прошли долгий путь.

В более конкретных терминах: какие хорошие правила?

  • Сколько чисел вам нужно добавлять/умножать, прежде чем потоки дают улучшения производительности или до того, как многопроцессорность даст улучшения производительности?
  • Сколько зависит от текущей реализации Julia?
  • Сколько это зависит от количества потоков/процессов?
  • Насколько сильно зависит архитектура? Существуют ли хорошие правила для того, чтобы знать, когда порог должен быть выше/ниже в конкретной системе?
  • Какие приложения нарушают эти эвристики?

Опять же, я не ищу жестких правил, просто общие рекомендации для руководства разработкой.

Ответ 1

Несколько предостережений: 1. Я говорю по опыту с версией 0.4.6 (и ранее), еще не сыграл с 0.5 (но, как я надеюсь, мой ответ ниже демонстрирует, я не думаю, что это имеет важное значение в отношении ответа, который я даю). 2. Это не полный ответ.

Тем не менее, по моему опыту, накладные расходы для нескольких процессов сами по себе очень малы при условии, что вы не имеете дело с проблемами перемещения данных. Другими словами, по моему опыту, в любое время, когда вы когда-либо находились в ситуации желая чего-то быстрее, чем один процесс на вашем процессоре может справиться, вы уже прошли мимо точки, где parallelism будет полезен. Например, в сумме примеров случайных чисел, которые вы дали, я обнаружил, что только после тестирования точка безубыточности находилась где-то около 10000 случайных чисел. Явным победителем стал все, что еще и parallelism. Генерация 10000 случайных чисел тривиальна для современных компьютеров, занимает небольшую долю секунды и значительно ниже порога, где я начинаю разочаровываться в медленности моих сценариев и хочу, чтобы parallelism ускорял их.

Таким образом, я, по крайней мере, придерживаюсь мнения, что, хотя, вероятно, есть еще более замечательные вещи, которые разработчики Джулии могли бы сделать, чтобы сократить накладные расходы еще больше, на данный момент все, что имеет отношение к Джулии, не собирается быть настолько большим из вашего ограничивающего фактора, по крайней мере, с точки зрения вычислительных аспектов parallelism. Я думаю, что есть еще улучшения в плане повышения как легкости, так и эффективности параллельного движения данных (мне нравится пакет, который вы начали на этой теме, как хороший шаг. Мы с вами, вероятно, согласятся там еще многое еще предстоит сделать). Но большими ограничивающими факторами будут:

  • Сколько данных необходимо перемещать между процессами?
  • Сколько вы читаете/записываете в свою память, что вам нужно делать во время ваших вычислений? (например, флопы на чтение/запись)

Аспект 1. может временами опираться на использование parallelism. Аспект 2. скорее всего означает, что вы не получите от этого столько преимуществ. И, по крайней мере, поскольку я интерпретирую "накладные расходы", ни один из них действительно не попадает прямо в это конкретное соображение. И, оба эти, я считаю, будут гораздо сильнее определяться вашим системным оборудованием, чем Julia.