Как я могу оценить функцию C из динамической библиотеки в пакете R? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь реализовать параллельные вычисления в пакете R, который вызывает C из R с помощью функции .C. Кажется, что узлы кластера не могут получить доступ к динамической библиотеке. Я сделал параллельный кластер сокетов, как это:

cl <- makeCluster(2)

Я бы хотел оценить функцию C с именем valgrad из моего пакета R на каждом из узлов в моем кластере, используя clusterEvalQ, из пакета R параллельно. Однако мой код выдает ошибку. Я компилирую свой пакет, но когда я запускаю

out <- clusterEvalQ(cl, cresults <- .C(C_valgrad, …))

где представляет аргументы в функции C valgrad. Я получаю эту ошибку:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: object 'C_valgrad' not found

Я подозреваю, что есть проблема с возможностью clusterEvalQ доступа к динамической библиотеке. Я попытался решить эту проблему, загрузив пакет glmm в кластер, используя

clusterEvalQ(cl, library(glmm))

но это не решило проблему.

Я могу оценить valgrad на каждом из кластеров, используя функцию foreach из пакета foreach R, например:

out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)}

no_cores - количество узлов в моем кластере. Однако эта функция не позволяет получить доступ к каким-либо результатам оценки valgrad при любых последующих вычислениях в кластере.

Как я могу

(1) делает результаты оценки valgrad доступными для последующих вычислений в кластере или

(2) используйте clusterEvalQ для оценки valgrad?

1 Ответ

0 голосов
/ 30 октября 2018

Вы должны загрузить внешнюю библиотеку. Но это не делается с library вызовами, это делается с dyn.load.
Следующие две функции полезны, если вы работаете с более чем одной операционной системой, они используют встроенную переменную .Platform$dynlib.ext.
Обратите внимание также на функцию разгрузки. Он понадобится вам, если вы разработаете библиотеку функций на Си. Если вы изменяете функцию C перед тестированием, динамическая библиотека должна быть выгружена, а затем (новая версия) перезагружена.

См. Запись расширений R , файл R-exts.pdf в папке doc, раздел 5 или CRAN .

dynLoad <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.load(dynlib)
}

dynUnload <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.unload(dynlib)
}
...