我使用并行和收集多核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)
Run Code Online (Sandbox Code Playgroud)
自R 2.14.0以来包含detectCores()的parallel软件包的功能可以实现您实际拥有多个内核时所需要的功能:
R> parallel::detectCores()
[1] 8
R>
Run Code Online (Sandbox Code Playgroud)
此外, 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>
Run Code Online (Sandbox Code Playgroud)
因此,对于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>
Run Code Online (Sandbox Code Playgroud)
令人遗憾的是,并行计算很棘手,而且比仅仅将表达式插入mcparallel或更难parallel.
| 归档时间: |
|
| 查看次数: |
1927 次 |
| 最近记录: |