makeForkCluster и nvblas (загружаются с помощью LD_PRELOAD)
Я хотел бы ускорить R-скрипт, который работает медленно.
Я протестировал две разные стратегии:
- Многопоточность с помощью makeForkCluster . Эта стратегия дает мне повышение производительности, уменьшая время выполнения.
- Разгрузка графического процессора. Я использую замену библиотеки blas. ( нвблас ). Чтобы внедрить библиотеку, я использую метод LD_PRELOAD .
Два подхода дают хороший прирост производительности, но хотелось бы использовать их одновременно, т.к. GPU загружен не полностью.
Я пытался использовать MT makeForkCluster и nvblas вместе. Я заметил, что nvblas не перехватывает вызовы из потоков (разветвленных makeForkCluster).
Я не могу понять, почему это происходит, если я переключаюсь с makeForkCluster на makeCluster, он работает. Но я хотел бы использовать метод Fork (сериализация не требуется).
пример кода:
library(foreach)
library(parallel)
ncpus = 10
N = 20
#cl <- parallel::makeForkCluster(ncpus, outfile="")
cl <- parallel::makeCluster(ncpus, outfile="")
doParallel::registerDoParallel(cl)
test = function(i){
message("started",i)
ORDER = 8*(2^i)
A = matrix(rnorm(ORDER^2), nrow=ORDER)
B = matrix(rnorm(ORDER^2), nrow=ORDER)
cputime = system.time({C = A %*% B})[3]
message("completed",i)
return(cputime)
}
foreach(i = 1:N, .combine = 'c') %dopar% {
test(i)
}
У Вас есть какие-то предложения?