2012-02-29 24 views
3

我使用並行和收集從多核ř包功能並行一個簡單的矩陣乘法的代碼。答案是正確的,但並行版本似乎與串行版本相同。檢測/確保使用多個核的多核

我懷疑這是執行上只有一個核心(而不是8個可用我的機器上!)。有沒有辦法檢測到這一點,並確保使用多個核心?

這裏是我的代碼:

library("multicore") 

A = read.table("matrixA.txt") 
B = read.table("matrixB.txt") 
A = as.matrix(A) 
B = as.matrix(B) 
rows = dim(A)[1] 
columns = dim(B)[2] 

C <- mcparallel(A%*%B) 
C <- collect(list(C)) 
C <- as.matrix(C[[1]]) 

write.table(C,"matrixC_mc.txt",row.names=FALSE, col.names=FALSE) 

回答

4

根據您使用的操作系統,只需要檢查你的處理器使用。當我使用並行處理時,我可以在top中清楚地看到我使用的所有六個處理器。

關於您的代碼示例,mcparallel(您不應該使用,根據手冊使用parallel)只是產生一個具有該表達式的新進程。所以如果你用矩陣乘法產生一個新的進程,就只用一個內核。只有多次調用parallel時,纔會啓動多個進程,並使用多個核心。也許如果你切割你的矩陣,在多個過程中運行它們,然後再合併它們,你可以獲得一些優勢。你可以看看mclapply。但平行的線性代數是也許更容易使用不multicore包,但使用blas(線性代數庫)版本支持並行處理的事情。

+0

是否有R中的呼叫(而不是用戶眼球頂部),它允許用戶檢查任務使用的內核數量 – tim 2015-01-14 13:28:52

+0

如果您有新問題,我建議您提出一個新問題而不是作爲評論發佈。作爲評論,它不會引起太多關注。在linux下,這一行可能很有用:http://stackoverflow.com/questions/6481005/obtain-the-number-of-cpus-cores-in-linux。 – 2015-01-14 13:37:11

5

parallel包的detectCores()功能包括由於R 2.14.0確實你需要看你實際有多個核心內容:

R> parallel::detectCores() 
[1] 8 
R> 

此外,mcparallel本身不轉的矩陣乘法成並行操作(因爲這是一個「硬」問題,請參閱ScaLAPACK庫)。但是你可以嘗試一些簡單的像這樣:

R> X <- 1:1e3 
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))), 
+>      parallel=mclapply(X, function(x) log(sqrt(x))), 
+>      replications=500) 
     test replications elapsed relative user.self sys.self user.child sys.child 
2 parallel   500 12.018 10.96  0.000 10.59  0.952  15.07 
1 serial   500 1.097  1.00  1.208  0.00  0.000  0.00 
R> 

所以對於一個簡單的操作(sqrt(log(x)))短期載體,平行收益的500次重複。但生活從不容易:在較大的向量差消失:

R> X <- 1:1e5 
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))), 
+>      parallel=mclapply(X, function(x) log(sqrt(x))), 
+>      replications=10) 
     test replications elapsed relative user.self sys.self user.child sys.child 
2 parallel   10 2.030  1.00  0.476 0.272  1.952  1.112 
1 serial   10 2.821  1.39  2.228 0.592  0.000  0.000 
R> 

可悲消息是並行計算是棘手的,並不僅僅是粘表達成mcparallelparallel更難。