我正在使用来自多核 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>

不幸的是,并行计算很棘手,而且比将表达式粘贴到 mcparallelparallel 中要困难得多。

关于r - 检测/确保在多核中使用多核,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9495345/

10-12 23:37