39 lines
789 B
R
39 lines
789 B
R
# Less inefficient parallel matrix multiply using custom matrix iterator
|
|
|
|
library(foreach)
|
|
|
|
iblkcol <- function(a, chunks) {
|
|
n <- ncol(a)
|
|
i <- 1
|
|
|
|
nextEl <- function() {
|
|
if (chunks <= 0 || n <= 0) stop('StopIteration')
|
|
m <- ceiling(n / chunks)
|
|
r <- seq(i, length=m)
|
|
i <<- i + m
|
|
n <<- n - m
|
|
chunks <<- chunks - 1
|
|
a[,r, drop=FALSE]
|
|
}
|
|
|
|
obj <- list(nextElem=nextEl)
|
|
class(obj) <- c('abstractiter', 'iter')
|
|
obj
|
|
}
|
|
|
|
# generate the input matrices
|
|
x <- matrix(rnorm(100), 10)
|
|
y <- matrix(rnorm(100), 10)
|
|
|
|
# multiply the matrices
|
|
nw <- getDoParWorkers()
|
|
cat(sprintf('Running with %d worker(s)\n', nw))
|
|
mit <- iblkcol(y, nw)
|
|
z <- foreach(y=mit, .combine=cbind) %dopar% (x %*% y)
|
|
|
|
# print the results
|
|
print(z)
|
|
|
|
# check the results
|
|
print(all.equal(z, x %*% y))
|