在 CRAN 上传递一个 R 包,在 MACOS 上由于 + OpenMP 出现问题
Pass an R package on CRAN with issues on MACOS due + OpenMP
我有一个 R package Fortran 和 OpenMP 无法通过 CRAN。我收到以下消息:
Your package no longer installs on macOS with OpenMP issues.
我的 Makevars 文件是:
USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)
C_OBJS = init.o
FT_OBJS = e_bottomup.o e_topdown.o check_nt.o
all:
@$(MAKE) $(SHLIB)
@rm -f *.o
$(SHLIB): $(FT_OBJS) $(C_OBJS)
init.o: e_bottomup.o e_topdown.o check_nt.o
如何解决这个问题?谢谢。
编辑 1:
我尝试添加标志 cpp:
USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS) *-cpp*
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)
在 !omp 之前的 Fortran 代码中添加条件 #ifdef _OPENMP...
但是通过 R CMD Check 我得到了消息:
Non-portable flags in variable 'PKG_FFLAGS': -cpp
你可以看看 data.table
包是如何使用 #ifdef _OPENMP
来处理的:https://github.com/Rdatatable/data.table/blob/master/src/myomp.h 我猜它在 Fortran 中应该非常相似
#ifdef _OPENMP
#include <omp.h>
#else
// for machines with compilers void of openmp support
#define omp_get_num_threads() 1
#define omp_get_thread_num() 0
#define omp_get_max_threads() 1
#define omp_get_thread_limit() 1
#define omp_get_num_procs() 1
#define omp_set_nested(a) // empty statement to remove the call
#define omp_get_wtime() 0
#endif
Makevars 文件没问题。 OMP 指令必须注释 !$,包括 USE OMP。
例如,我用 Fortran 和 OMP 创建了一个 R 包来测试(并使用它)。
我包含了一个 R 函数来 return 每台机器的最大线程数:
Fortran 代码是:
SUBROUTINE checkntf (nt)
!$ USE OMP_LIB
IMPLICIT NONE
INTEGER nt
!$ nt = OMP_GET_MAX_THREADS()
RETURN
END
已在 Windows、Ubuntu 和 macOS 上安装,如图 here
我有一个 R package Fortran 和 OpenMP 无法通过 CRAN。我收到以下消息:
Your package no longer installs on macOS with OpenMP issues.
我的 Makevars 文件是:
USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)
C_OBJS = init.o
FT_OBJS = e_bottomup.o e_topdown.o check_nt.o
all:
@$(MAKE) $(SHLIB)
@rm -f *.o
$(SHLIB): $(FT_OBJS) $(C_OBJS)
init.o: e_bottomup.o e_topdown.o check_nt.o
如何解决这个问题?谢谢。
编辑 1:
我尝试添加标志 cpp:
USE_FC_TO_LINK =
PKG_FFLAGS = $(SHLIB_OPENMP_FFLAGS) *-cpp*
PKG_LIBS = $(SHLIB_OPENMP_FFLAGS)
在 !omp 之前的 Fortran 代码中添加条件 #ifdef _OPENMP...
但是通过 R CMD Check 我得到了消息:
Non-portable flags in variable 'PKG_FFLAGS': -cpp
你可以看看 data.table
包是如何使用 #ifdef _OPENMP
来处理的:https://github.com/Rdatatable/data.table/blob/master/src/myomp.h 我猜它在 Fortran 中应该非常相似
#ifdef _OPENMP
#include <omp.h>
#else
// for machines with compilers void of openmp support
#define omp_get_num_threads() 1
#define omp_get_thread_num() 0
#define omp_get_max_threads() 1
#define omp_get_thread_limit() 1
#define omp_get_num_procs() 1
#define omp_set_nested(a) // empty statement to remove the call
#define omp_get_wtime() 0
#endif
Makevars 文件没问题。 OMP 指令必须注释 !$,包括 USE OMP。
例如,我用 Fortran 和 OMP 创建了一个 R 包来测试(并使用它)。
我包含了一个 R 函数来 return 每台机器的最大线程数:
Fortran 代码是:
SUBROUTINE checkntf (nt)
!$ USE OMP_LIB
IMPLICIT NONE
INTEGER nt
!$ nt = OMP_GET_MAX_THREADS()
RETURN
END
已在 Windows、Ubuntu 和 macOS 上安装,如图 here