Требование доступности 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/

Другие вопросы по тегам