哪些問題適合平行運算

撰寫高效 R 程式碼

Colin Gillespie

Jumping Rivers & Newcastle University

下廚比喻

多一雙手

廚師太多

廚師太多反而壞了湯

撰寫高效 R 程式碼

平行執行

  • 不是每個分析都能用多核心
    • 許多統計演算法只能用單核心

那麼平行運算能幫上什麼忙?

撰寫高效 R 程式碼

Monte-Carlo 模擬

for(i in 1:8)
    sims[i] <- monte_carlo()
# User defined function
combine_simulations(sims)
  • 8 核心機器
    • 每個核心跑一個模擬
    • 最後把結果合併
  • 極度可並行(embarrassingly parallel)
撰寫高效 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...