Сбой параллельного выполнения для XGBoost с R и OS-X - PullRequest
0 голосов
/ 31 августа 2018

Не может работать xgboost параллельно с R 3.5.1 и OS X 10.12.6. Я следовал этим инструкциям . Кажется, что openMP OK при компиляции кода C, но при компиляции в R не может найти параметр -fopenmp, и параллельное выполнение не работает.

Makevars

cat ~/.R/Makevars 
CC=gcc-7
CXX=g++-7
CXX1X=g++-7
CXX11=g++-7
CXX14=g++-7
CXX17=g++-7

SHLIB_OPENMP_CFLAGS=-fopenmp
SHLIB_OPENMP_CXXFLAGS=-fopenmp
SHLIB_OPENMP_FCFLAGS=-fopenmp
SHLIB_OPENMP_FFLAGS=-fopenmp

Я тоже безуспешно пробовал gcc-8.

Эксперименты:

  • Скомпилируйте код C: xgboost$ make -j4 => похоже, работает, -fopenmp включена опция компилятора: g++-7 -c -DDMLC_LOG_CUSTOMIZE=1 -std=c++11 -Wall -Wno-unknown-pragmas -Iinclude -Idmlc-core/include -Irabit/include -I/include -O3 -funroll-loops -msse2 -fPIC -fopenmp src/common/common.cc -o build/common/common.o

  • Из источника: R-package$ R CMD INSTALL . => checking whether OpenMP will work in a package... no и g++-7 -std=gnu++11 -I"/usr/local/Cellar/r/3.5.1/lib/R/include" -DNDEBUG -I../..//include -I../..//dmlc-core/include -I../..//rabit/include -I../../ -DXGBOOST_STRICT_R_MODE=1 -DDMLC_LOG_BEFORE_THROW=0 -DDMLC_ENABLE_STD_THREAD=1 -DDMLC_DISABLE_STDIN=1 -DDMLC_LOG_CUSTOMIZE=1 -DXGBOOST_CUSTOMIZE_LOGGER=1 -DRABIT_CUSTOMIZE_MSG_ -DRABIT_STRICT_CXX98_ -I/usr/local/opt/gettext/include -I/usr/local/opt/readline/include -I/usr/local/include -fPIC -g -O2 -c xgboost_R.cc -o xgboost_R.o

Похоже, что R не принимает во внимание опции SHLIB_OPENMP_* из Makevars. Есть идеи?

1 Ответ

0 голосов
/ 31 августа 2018

Благодаря hcho3 (https://github.com/dmlc/xgboost/issues/2503)

mkdir build
cd build
cmake .. -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7 -DR_LIB=ON
make
make install

Последняя установка make может завершиться неудачно. Если это произойдет, запустите

# still inside build/
cd R-package
mv src/libxgboost.dylib src/xgboost.so # in my case 'mv src/xgboost.dylib src/xgboost.so'
R CMD INSTALL .

Его объяснение: До сих пор у меня не было большого успеха в модификации Makevars, так как она перезаписывается скриптом configure в R-package. Когда дело доходит до применения пользовательских параметров сборки, в IMO гораздо проще использовать CMake, который будет генерировать файлы конфигурации и другие файлы сборки в пакете R (следовательно, каталог R-пакета генерируется под сборкой /). Единственный недостаток, который я видел до сих пор с CMake он генерирует общую библиотеку с именем libxgboost.dylib, тогда как R ожидает xgboost.so

...