2011-09-29 78 views
4

作爲一個玩具的例子,假設我們有一個名爲'my_func'的函數(代碼如下),它需要兩個參數'n'和'p'。我們的函數'my_func'將生成一個隨機矩陣'x',其中包含'n'行和'p'列,並且在運行時和內存使用中執行一些昂貴的操作,例如計算'x'的奇異值之和。 (當然,該功能是一個班輪,但我在這裏拍攝的可讀性。)向量化與R中的並行化

my_func <- function(n, p) { 
    x <- replicate(p, rnorm(n)) 
    sum(svd(x)$d) 
} 

如果我們要計算「my_func,並將」的「N」的幾個值,併爲「每個值N「我們有幾個值‘p’,然後向量化的功能,然後將其組合爲‘my_func,並將’是直接的:

n <- 10 * seq_len(5) 
p <- 100 * seq_len(10) 
grid <- expand.grid(n = n, p = p) 
my_func <- Vectorize(my_func) 
set.seed(42) 
do.call(my_func, grid) 
[1] 98.61785 195.50822 292.21575 376.79186 468.13570 145.18359 
[7] 280.67456 421.03196 557.87138 687.75040 168.42994 340.42452 
[13] 509.65528 683.69883 851.29063 199.08474 400.25584 595.18311 
[19] 784.21508 982.34591 220.73215 448.23698 669.02622 895.34184 
[25] 1105.48817 242.52422 487.56694 735.67588 976.93840 1203.25949 

注意,每次調用‘my_func,並將’可以是對於大十分緩慢」 n'和'p'(首先嚐試n = 1000和p = 2000)。

現在,在我的具有類似構造函數的實際應用中,「網格」中的行數比這裏給出的大得多。因此,我試圖更好地理解R中的矢量化。

第一個問題:在上面的例子中,對'my_func'的調用是否按順序執行,以便在下次調用之前一次調用的內存使用量被垃圾收集?我經常使用矢量化,但從來沒有停止問這個問題。

第二個問題:(這個問題可能取決於第一個問題)假設調用的數量足夠大並且'my_func'足夠慢,是否需要並行化?我假設是。我的real問題是:如果在每個調用中傳遞給它的'my_func'有相同的大矩陣,那麼在此是否需要並行化?爲了論證,假設矩陣被稱爲'y',具有1000行和5000列,並且被即時計算。當然,將矩陣'y'傳遞給每個並行節點會產生一些滯後。

我明白第二個問題的答案可能是「這取決於...」如果是這樣的話,請讓我知道,我會盡量給出更多的細節。

而且,我很欣賞的任何建議,意見或OMFG WTF N00B你有沒有看到這個其他OBSCURE有些相關的討論?? !!! 111oneone1

回答

8

回答第一個問題很顯然是肯定的:R中的幾乎所有都是默認串行。 (很少有內部開始使用OpenMP,但R作爲引擎可能仍然是單線程的)。

因此對於第二個問題:是的,請嘗試一下。我不多使用Vectorize(),但我確實喜歡*apply()家族。用lapply()解決它,然後加載multicore包,並使用mclapply()在儘可能多的內核上運行它。下面是一個例子:

R> system.time(res <- lapply(1:nrow(grid), 
+       function(i) my_func(grid[i,1],grid[i,2]))) 
    user system elapsed 
    0.470 0.000 0.459 
R> system.time(res <- mclapply(1:nrow(grid), 
+        function(i) my_func(grid[i,1], grid[i,2]))) 
    user system elapsed 
    0.610 0.140 0.135 
R> 

通知經過時間現在是如何約29%(= 0.135/0.459)的原始的。

從這裏你可以進一步概括並行執行跨越幾臺機器 - High-Performane Computing with R上的任務視圖有進一步的指針。 R 2.14.0將於10月31日發佈,將有一個新的「並行」程序包,其中包含multicoresnow的部分內容。

+0

感謝您的回覆。我通過Rmpi並行使用了多達512個內核的foreach,並通過8核心盒上的多核。雖然它爲並行計算提供了一個簡單的界面,並且允許我爲不同機器上的不同配置編寫一次,但不知道引擎蓋下發生了什麼正在引起一些令人頭疼的問題。 – ramhiser

+0

我經常使用* apply()系列,所以我會檢查出mclapply。任何有8個核心的多臺機器集羣的想法?此外,下雪(甚至是降雪)是否可以輕鬆地編寫代碼,然後通過更改後端端口轉到其他配置?看起來我有一些玩法要做。 – ramhiser

+0

Dirk - 將在Windows®上支持R 2.14.0中的「並行」功能? (請說是,請說是=) – SFun28