Какие задачи выигрывают от параллельных вычислений

Эффективный код на R

Colin Gillespie

Jumping Rivers & Newcastle University

Кулинария

Лишняя пара рук

Слишком много поваров

Слишком много поваров портят бульон

Эффективный код на R

Параллельное выполнение

  • Не каждый анализ может использовать несколько ядер
    • Многие статистические алгоритмы работают только на одном ядре

Где же помогут параллельные вычисления?

Эффективный код на R

Симуляции Монте-Карло

for(i in 1:8)
    sims[i] <- monte_carlo()
# User defined function
combine_simulations(sims)
  • Машина с 8 ядрами
    • Одна симуляция на каждое ядро
    • Результаты объединяются в конце
  • Задача с тривиальным распараллеливанием
Эффективный код на R

Не всё можно распараллелить

x <- 1:8
for(i in 2:8)
    x[i] <- x[i-1]
x[8] = x[7] = ... x[2] = x[1] = 1
  • Можно ли запустить это параллельно?
    • НЕТ
      • Порядок вычислений при параллельном выполнении непредсказуем
      • Результат окажется неверным: x[3] может вычислиться раньше x[2]
Эффективный код на R

Практическое правило

Можно ли запустить цикл как в прямом, так и в обратном направлении?

for(i in 1:8)
    sim[i] <- monte_carlo_simulation()

for(i in 8:1)
    sim[i] <- monte_carlo_simulation()
  • Оба цикла дают одинаковый результат
  • Значит, циклы можно выполнять параллельно
Эффективный код на R

Практическое правило

Можно ли запустить цикл как в прямом, так и в обратном направлении?

x <- 1:8
for(i in 2:8)
    x[i] <- x[i-1]
for(i in 8:2)
    x[i] <- x[i-1]
  • Циклы дают разные результаты
    • Первый: x[8] = x[7] = ... = 1
    • Второй: x[8] = x[7] = 7
  • Параллельные вычисления не применимы

Запомните: если цикл можно выполнить в обратном порядке, скорее всего, его можно распараллелить.

Эффективный код на R

Давайте потренируемся!

Эффективный код на R

Preparing Video For Download...