我正在使用来自多核 R 包的并行和收集函数来并行化一个简单的矩阵乘法代码。答案是正确的,但并行版本似乎与串行版本花费的时间相同。
我怀疑它是否仅在一个内核上执行(而不是我的机器上可用的 8 个内核!)。有没有办法检测到这一点并确保使用超过 1 个内核?
这是我的代码:
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)
最佳答案
自 R 2.14.0 以来包含的 detectCores()
包的 parallel
函数执行您需要查看的操作,如果您确实有多个内核:
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>
不幸的是,并行计算很棘手,而且比将表达式粘贴到
mcparallel
或 parallel
中要困难得多。关于r - 检测/确保在多核中使用多核,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9495345/