Які задачі виграють від паралельних обчислень

Ефективне програмування 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...