检测/确保在多核中使用多个内核

Adi*_*iti 3 multicore r

我使用并行和收集多核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)

Dir*_*tel 5

自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.