Требование доступности OpenMP для использования в пакете Rcpp
Я подготовил пакет в R с помощью RcppArmadillo
а также OpenMP
библиотеки и следующие команды:
RcppArmadillo.package.skeleton("mypackage")
compileAttributes(verbose=TRUE)
Кроме того, в DESCRIPTION
файл, который я добавил:
Imports: Rcpp (>= 0.12.8), RcppArmadillo
LinkingTo:Rcpp, RcppArmadillo
Depends: RcppArmadillo
и в NAMESPACE
файл, который я добавил:
import(RcppArmadillo)
importFrom(Rcpp, evalCpp)
Затем я запускаю следующие коды в cmd
:
R CMD build mypackage
R CMD INSTALL mypackage.tar.gz
Я собираю и устанавливаю пакет на свой компьютер и использую его сейчас. Но мои коллеги и друзья не могут установить пакет. Сообщения об ошибках о RcppArmadillo
а также OpenMP
библиотеки.
Например:
фатальная ошибка: файл 'omp.h' не найден
У кого-нибудь есть предыдущий опыт в этом деле? Какой тип настроек я должен сделать в своем пакете для решения этой проблемы?
1 ответ
Поздравляем! Скорее всего, вы наткнулись на отсутствие MacOS OpenMP
служба поддержки. Это было задокументировано в FAQ по Rcpp как запись 2.10.3.
Защитное кодирование
Причина ошибки в том, что вы не защитили OpenMP
кодировать соответственно... например
Включения заголовка защищены:
#ifdef _OPENMP
#include <omp.h>
#endif
Код имеет защиту, предоставляемую:
#ifdef _OPENMP
// multithreaded OpenMP version of code
#else
// single-threaded version of code
#endif
Это предполагает, что вы не используете препроцессор #omp
теги, но более глубокие вызовы функций omp. Если это предшествующее, то защита кода не важна, поскольку теги препроцессора будут отброшены.
(Для тех давних пользователей вышеупомянутых макросхем, приходящих сюда, обратите внимание, что начиная с R 3.4.0, SUPPORT_OPENMP
определение было удалено полностью в пользу _OPENMP
.)
Создание требования пакета для OpenMP
с помощью configure.ac
Однако вышесказанное является просто хорошим защитным кодированием. Если вашему пакету требуется определенная функция, возможно, пришло время рассмотреть возможность использования autoconf
файл называется configure.ac
генерировать configure
скрипт.
Поместите configure.ac
на верхнем уровне вашего пакета.
packagename/
|- data/
|- inst/
|- man/
|- src/
|- Makevars
|- HelloWorld.cpp
|- DESCRIPTION
|- NAMESPACE
|- configure.ac
|- configure
configure.ac
должен содержать следующее:
AC_PREREQ(2.61)
AC_INIT(your_package_name_here, m4_esyscmd_s([awk -e '/^Version:/ {print $2}' DESCRIPTION]))
AC_COPYRIGHT(Copyright (C) 2017 your name?)
## Determine Install Location of R
: ${R_HOME=$(R RHOME)}
if test -z "${R_HOME}"; then
AC_MSG_ERROR([Could not determine R_HOME.])
fi
## Setup RBin
RBIN="${R_HOME}/bin/R"
CXX=`"${RBIN}" CMD config CXX`
CPPFLAGS=`"${RBIN}" CMD config CPPFLAGS`
CXXFLAGS=`"${RBIN}" CMD config CXXFLAGS`
## Package Requires C++
AC_LANG(C++)
AC_REQUIRE_CPP
## Compiler flag check
AC_PROG_CXX
## Borrowed from BHC/imager/icd/randomForest
# Check for OpenMP
AC_OPENMP
# since some systems have broken OMP libraries
# we also check that the actual package will work
ac_pkg_openmp=no
if test -n "${OPENMP_CFLAGS}"; then
AC_MSG_CHECKING([OpenMP detected, checking if viable for package use])
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include <omp.h>]], [[ return omp_get_num_threads (); ]])])
"$RBIN" CMD SHLIB conftest.c 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD && "$RBIN" --vanilla -q -e "dyn.load(paste('conftest',.Platform\$dynlib.ext,sep=''))" 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD && ac_pkg_openmp=yes
AC_MSG_RESULT([${ac_pkg_openmp}])
fi
# if ${ac_pkg_openmp} = "yes" then we have OMP, otherwise it will be "no"
if test "${ac_pkg_openmp}" = no; then
AC_MSG_WARN([No OpenMP support. If using GCC, upgrade to >= 4.2. If using clang, upgrade to >= 3.8.0])
AC_MSG_ERROR([Please use a different compiler.])
fi
# Fin
AC_OUTPUT
Для генерации configure
скрипт, запустите:
autoconf
Как только это будет сделано, вам нужно будет пересобрать ваш пакет. Обратите внимание, вам может понадобиться установить autoconf
если на Windows и на MacOS вам, вероятно, нужно установить его через homebrew.
Помогая пользователям получить жизнеспособные OpenMP
компилятор
Теперь вы можете убедиться, что ваши коллеги могут получить ускорение от вашего OpenMP
код Для этого нужно включить OpenMP
заставив ваших коллег перейти от использования системного компилятора по умолчанию к "истинному" gcc
или жизнеспособный omp
включен clang
компилятор.
Инструкции для обоих на macOS приведены здесь:
http://thecoatlessprofessor.com/programming/openmp-in-r-on-os-x/