나는 다른 R 패키지 (survival, nbpMatching, MASS)에 의존하고 더 많은 의존성을 가져 오는 the R package crossmatch을 사용하고 있습니다. 크로스 매치 패키지는 (잠재적으로) 큰 매트릭스에 대한 통계 테스트를 구현하는데, 이는 (MCMC 알고리즘 내에서) 매우 자주 계산해야합니다. 나는 (마지막 줄에 crossmatchtest()
입니다) 실제 시험이 계산되기 전에 몇 가지 전처리 단계를 계산 다음 래퍼 작성했습니다 :R에 사용되는 CPU 수를 제어하는 방법은 무엇입니까?
# wrapper function to directly call the crossmatch test with a single matrix
# first column of the matrix must be a binary group indicator, following columns are observations
# code is modified from the documentation of the crossmatch package
crossmatchdata <- function(dat) {
# the grouping variable should be in the first column
z = dat[,1]
X = subset(dat, select = -1)
## Rank based Mahalanobis distance between each pair:
# X <- as.matrix(X)
n <- dim(X)[1]
k <- dim(X)[2]
for (j in 1:k) {
X[, j] <- rank(X[, j])
}
cv <- cov(X)
vuntied <- var(1:n)
rat <- sqrt(vuntied/diag(cv))
cv <- diag(rat) %*% cv %*% diag(rat)
out <- matrix(NA, n, n)
icov <- ginv(cv)
for (i in 1:n) {
out[i, ] <- mahalanobis(X, X[i, ], icov, inverted = TRUE)
}
dis <- out
## The cross-match test:
return(crossmatchtest(z, dis))
}
내가 눈치 챘을 그 행렬 오히려 작은 경우,이 테스트 하나의 CPU 만 사용합니다.
library(MASS)
library(crossmatch)
source("theCodeFromAbove.R")
# create a dummy matrix
m = cbind(c(rep(0, 100), rep(1, 100)))
m = cbind(m, (matrix(runif(100), ncol=10, nrow=20, byrow=T)))
while(TRUE) { crossmatchdata(m) }
htop
으로 모니터링합니다.
# create a dummy matrix
m = cbind(c(rep(0, 1000), rep(1, 1000)))
m = cbind(m, (matrix(runif(100000), ncol=1000, nrow=2000, byrow=T)))
while(TRUE) { crossmatchdata(m) }
나는 일반적으로이 병렬화와 괜찮아하지만 난 싶습니다 :이 매트릭스를 증가하고있어 경우에 (적어도가이 모양)을 사용할 수 있습니다 그러나, R은 많은 코어를 사용합니다 R 프로세스가 사용하는 코어 수를 수동으로 제어 할 수 있습니다. 나는 성공하지 못한 채 options(mc.cores = 4)
을 시도했다.
내가 설정할 수있는 다른 변수가 있습니까? 또는 하나 이상의 코어를 사용하는 패키지를 찾는 가장 좋은 방법은 무엇입니까? 종속성에서
먼저 코드의 어느 부분이 병렬화되는지 알려줄 필요가 있습니다. 당신이 사용하는 기능은 무엇입니까? 아니면 R에 링크 된 BLAS 내의 병렬 처리입니까? 바닐라 (기본) R은 병렬 처리되지 않습니다. – Roland
그게 내 질문의 핵심이야. 나는 어떤 코드도 병렬 처리하지 않았다. 자동적으로 어딘가에서 의존성이 깊어지고 어디서부터인지 모른다. 나는 crossmatch를 위해 문서에서 nbpMatching과 MASS를 보았다. 그들은 평행 화에 대해 말하고 있지만 그렇지 않은지 알아 보았다. 편집 : 위의 코드는 자신의 PC에서이 코드를 실행하기에 충분해야합니다. 흥미롭게도 병렬화는 Ubuntu 16.04 및 MacOS 10.12에서만 발생했지만 Fedora 27에서는 발생하지 않았습니다. – kartoffelsalat