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)
}

У Вас есть какие-то предложения?

0 ответов

Другие вопросы по тегам