我正在编写一个使用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
中找到答案 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