Как говорится в заголовке, каковы накладные расходы на различные формы 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?
- Сколько это зависит от количества потоков/процессов?
- Насколько сильно зависит архитектура? Существуют ли хорошие правила для того, чтобы знать, когда порог должен быть выше/ниже в конкретной системе?
- Какие приложения нарушают эти эвристики?
Опять же, я не ищу жестких правил, просто общие рекомендации для руководства разработкой.