设置使用Fortran和PpenMP的R包中的线程数

时间:2019-02-01 18:16:13

标签: r fortran openmp

我正在编写一个使用Fortran和OpenMP的简单R包。这是我的fortran模块:

module im_f_module
   use omp_lib
   implicit none
   contains

subroutine fill_matrix(N,K,A,ncores) bind(C, name="fill_")
   use, intrinsic                                         :: iso_c_binding, only : c_double, c_int
   integer(c_int), intent(in)                             :: N,K, ncores
   real(c_double), DIMENSION(N, K), intent(out)           :: A
   integer                                                :: nn, kk, thread_num
   ! Specify number of threads to use:
    !$ call omp_set_num_threads(ncores)
    !$omp parallel private(thread_num)
    !$omp parallel do
    do nn=1,N
       do kk=1,K
          !$ thread_num = omp_get_thread_num()
          A(nn,kk) = thread_num
       end do
       !print *, A(nn, :)
    end do
    !$omp end parallel do
end subroutine fill_matrix



end module im_f_module

当我调用调用模块的R函数时,我希望矩阵的每个元素都有一个线程号。例如:

fill_my_matrix(N = 2, K = 2, ncores = 4)

应具有4个不同的值。 las,它只有一个:

     [,1] [,2]
[1,]    0    0
[2,]    0    0

我的猜测是!$ call omp_set_num_threads(ncores)并未将线程数设置为4。我该如何解决?

如果有帮助,我的包裹的所有代码都可以在this github repo

中找到

1 个答案:

答案 0 :(得分:1)

我可以使用OpenMPController软件包来使它正常工作。如果有更好的方法可以做到这一点,我很乐意学习。现在,我只修改了我的R函数,如下所示:

#'@export
#'@useDynLib fortranMatrix, .registration = TRUE
fill_my_matrix <- function(N=10, K=5, nthreads=4) {
  (OpenMPController::omp_set_num_threads(nthreads))
  A <- .Fortran("fill",
                N = as.integer(N),
                K = as.integer(K),
                A = matrix(1982,nrow = N, ncol = K),
                nthreads = as.integer(nthreads))
  return(A$A)
}

这就是我得到的称呼:

> fill_my_matrix(N = 6, K = 6, nthreads = 6)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    0    0    0    0    0
[2,]    1    1    1    1    1    1
[3,]    2    2    2    2    2    2
[4,]    3    3    3    3    3    3
[5,]    4    4    4    4    4    4
[6,]    5    5    5    5    5    5