Вызов подпрограмм Fortran из R foreach на платформе Linux
rm(list=ls())
library(doParallel)
dyn.load("bar.so")
foo <- function(x) {
if (!is.numeric(x))
stop("arg x must be numeric")
out <- .Fortran("bar",
n=as.integer(length(x)),
x=as.double(x))
return(out$x)
}
foo2 <- function(y) {
y2 <- y * y
return(y2)
}
cl <- makeCluster(2)
registerDoParallel(cl)
result <- array(data=0.0,c(5,3))
for(num in 10:14){
num_list <- c(num, num+3, num-1)
result[num-9,] <-foo(num_list)
cat(paste("num = ",num," ", result[num-9,],"\n"))
}
result2 <- array(data=0.0,c(5,3))
for(num in 10:14){
num_list <- c(num, num+3, num-1)
result2[num-9,] <-foo2(num_list)
cat(paste("num = ",num," ", result2[num-9,],"\n"))
}
result_par <- array(data=0.0,c(5,3))
foreach(num = 10:14, .verbose=TRUE) %dopar%{
num_list <- c(num, num+3, num-1)
filename <- paste0("Result_",num)
result_par[num-9,] <-foo(num_list)
#result_par[num-9,] <-foo2(num_list)
write.csv(result_par[num-9,],filename)
}
stopCluster(cl)
Выше написан тестовый код, который воспроизводит ошибку, которую я получаю с моим реальным кодом. Фактический код на Фортране длинный и сложный, и для его перекодирования потребуется слишком много времени, поэтому я пытаюсь вызвать его, загрузив как общий объект. Общий объект был создан из командной строки со строкой: R CMD SHLIB bar.f
Это работает нормально, пока я не попытаюсь вызвать подпрограмму Fortran из цикла foreach. Тогда я получаю следующую ошибку:
automatically exporting the following variables from the local environment:
foo, num_list, result_par
numValues: 5, numResults: 0, stopped: TRUE
got results for task 1
accumulate got an error result
numValues: 5, numResults: 1, stopped: TRUE
returning status FALSE
got results for task 2
numValues: 5, numResults: 2, stopped: TRUE
returning status FALSE
got results for task 3
numValues: 5, numResults: 3, stopped: TRUE
returning status FALSE
got results for task 4
numValues: 5, numResults: 4, stopped: TRUE
returning status FALSE
got results for task 5
numValues: 5, numResults: 5, stopped: TRUE
not calling combine function due to errors
returning status TRUE
Error in { :
task 1 failed - "Fortran symbol name "bar" not in load table"
Если я использую foo2
скорее, чем foo
в цикле foreach он работает нормально. Таким образом, похоже, что проблема связана с использованием общей библиотеки.
Я использую:
Версия R 3.3.1 (2016-06-21) - "Ошибка в ваших волосах" Copyright (C) 2016 Фонд статистических вычислений R
Платформа: x86_64-pc-linux-gnu (64-разрядная версия)