Ускорение RcppArmadillo: как сделать ссылку на OpenBlas в пакете R

Я работаю над пакетом R, который использует RcppArmadillo. Я пытаюсь воспользоваться более быстрым умножением матриц, найденным в OpenBLAS. В документации библиотеки C++ armadillo говорится, что если на нашей машине установлен OpenBLAS, то Armadillo будет использовать OpenBLAS вместо BLAS. Однако, когда я компилирую свой пакет R, я получаю что-то вроде этого:

g++ -m64 -std=c++11 -shared -L/usr/lib64/R/lib -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o PackageTest.so class1.o class2.o class3.o class4.o class5.o class6.o class7.o RcppExports.o class8.o class9.o class10.o -L/usr/lib64/R/lib -lRlapack -L/usr/lib64/R/lib -lRblas -lgfortran -lm -lquadmath -L/usr/lib64/R/lib -lR

Итак, он компилируется с параметрами -lRlapack и -lRblas. Как правильно изменить файлы Makevars и Makevars.win, чтобы RcppArmadillo скомпилировал пакет с параметром -lopenblas? Моя попытка решить эту проблему состояла в том, чтобы изменить файл Makevars следующим образом:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
PKG_CXXFLAGS =-fopenmp -std=c++11 -lopenblas
PKG_CXX1XFLAGS = $(PKG_CXXFLAGS)

Пакет скомпилировался с -lopenblas, но лучше ли это сделать?


person kolonel    schedule 10.07.2017    source источник


Ответы (2)


Это проблема с вашей установкой RedHat, которая решила полагаться на внутренние источники LAPACK для R при установке R --- плюс тот факт, что RcppArmadillo использует то, что использует R.

На моей машине на основе Debian/Ubuntu это происходит по-другому. то есть для

R> library(Rcpp)
R> cppFunction("arma::mat foo(arma::mat x) { return x + x;} ", depends="RcppArmadillo", verbose=TRUE)

Я получаю (в том числе)

g++ -Wl,-S -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions \
    -Wl,-z,relro -o sourceCpp_4.so file677111d81351.o \
    -fopenmp -llapack -lblas -lgfortran -lm -lquadmath \
    -L/usr/lib/R/lib -lR

и мы видим -llapack -lblas -lgfortran как и ожидалось.

person Dirk Eddelbuettel    schedule 10.07.2017
comment
В вашем случае, как бы вы скомпилировали с помощью openblas? Кроме того, отличаются ли -llapack и -lblas по производительности от -lRlapack и -lRblas? - person kolonel; 10.07.2017
comment
Debian предлагает выбор между подключаемыми альтернативами, все из которых доступны через -llapack -lblas. По умолчанию используется базовый, т.е. «эталонный» BLAS, и OpenBLAS доступен, если вы хотите. OpenBLAS, вероятно, лучше, чем по умолчанию, который поставляется с R или в эталонном BLAS. - person Dirk Eddelbuettel; 10.07.2017
comment
Однако ваш вопрос относится к RedHat, поэтому я бы внес его в список r-sig-fedora. Это не имеет ничего общего с Rcpp или RcppArmadillo. Все пакеты в порядке, здесь важно как R был установлен для вас. - person Dirk Eddelbuettel; 10.07.2017
comment
Я не думаю, что это специфично для Fedora, потому что в конечном итоге другие люди будут пробовать это на различных ОС, поэтому важно документировать, как мы модифицируем файл makevars, чтобы пакет R компилировался с использованием OpenBLAS. На самом деле я также использую свой пакет на машине с Ubuntu, поэтому было бы здорово показать нам, как изменить файл makevars для компиляции с помощью -lopenblas. - person kolonel; 10.07.2017
comment
Я думаю, вы все еще упускаете мою мысль. Он работает по умолчанию, если R установлен правильно. R поставляется с полным руководством по «Установке и администрированию» — вы его видели? - person Dirk Eddelbuettel; 10.07.2017
comment
Также ваша вторая часть вашего вопроса просто неверна. Вы добавили команду ссылки к флагу компилятора. Неправильный. Добавьте -lopenblad к PKG_LIBS, но это не отменяет того факта, что R уже даст вам свое - и это точно суть как вашей проблемы, так и ядра моего ответа. - person Dirk Eddelbuettel; 10.07.2017

Инструкции по компиляции R, OpenBLAS и связыванию R с OpenBLAS (GNU/Linux)

Я считаю, что вашей самой большой проблемой является привязка R к библиотеке OpenBLAS. Поэтому описанные ниже шаги помогут вам добиться успеха в этой ссылке.

Компиляция OpenBLAS

Первоначально загрузите исходные коды R и OpenBLAS (Open оптимизированная библиотека BLAS) в OpenBLAS. В каталоге файлов выполните следующие действия.

tar -zxvf OpenBLAS*
cd OpenBLAs*
make -j $nproc
sudo make install
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib/

or

git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS*
make -j $nproc
sudo make install
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib/

Примечание. Это ускорит компиляцию, используя все возможности вашего процессора. Чтобы узнать количество ядер, выполните: nproc.

Компиляция Armadillo C++ с помощью OpenBLAS

Для тех, кто использует коды C++ в R с помощью библиотеки Rcpp, настройка Armadillo с помощью Библиотека OpenBLAS может оказаться полезной.

tar -xvf armadillo*
cd armadillo*
./configure -DCMAKE_PREFIX_PATH=/opt/OpenBLAS/lib/
cmake . -DCMAKE_PREFIX_PATH=/opt/OpenBLAS/lib/
make -j $nproc
sudo make install

Примечание. Дополнительные сведения о компиляции библиотеки Armadillo можно найти по адресу https://gitlab.com/conradsnicta/armadillo-code.

Компиляция R с помощью OpenBLAS

После компиляции OpenBLAS загрузите код R. Нет необходимости компилировать R для использования OpenBLAS, но компиляция языка может принести некоторые преимущества, которые могут быть незначительными в зависимости от того, что делается в R. . Таким образом, загрузите исходный код языка R.

Примечание. В моей операционной системе Arch Linux (OpenBLAS) был установлен в каталоге /opt. Найдите каталог установки OpenBLAS в вашем дистрибутиве GNU/Linux.

В каталоге, в который был загружен R, выполните следующие действия:

tar -zxvf R*
cd R-* && ./configure --enable-R-shlib --enable-threads=posix --with-blas="-lopenblas -L/opt/OpenBLAS/lib -I/opt/OpenBLAS/include -m64 -lpthread -lm"
make -j $nproc
sudo make install

Скорее всего, библиотека OpenBLAS будет привязана к R. Чтобы проверить, запустите в R код sessionInfo(). Должно появиться что-то вроде вывода ниже:

Matrix products: default
BLAS/LAPACK: /opt/OpenBLAS/lib/libopenblas_haswellp-r0.3.6.dev.so

Если связывание не происходит, выполните шаги, описанные в приведенном ниже коде.

Нам нужно связать R с файлом libopenblas_*, созданным в процессе компиляции библиотеки OpenBLAS. В моем случае это файл ibopenblas_haswellp-r0.2.20.so. Найдите это в /opt/OpenBLAS/lib или в каталоге, где был установлен OpenBLAS в вашей системе GNU/Linux. Также найдите каталог с файлами libRblas.so в R каталог установки языка. В Arch это каталог /usr/local/lib64/R/lib.

cd /usr/local/lib64/R/lib
mv libRblas.so libRblas.so.keep
ln -s /opt/OpenBLAS/lib/libopenblas_haswellp-r0.2.20.so libRblas.so

Начните раздел языка R и выполните sessionInfo(). Вы должны отметить что-то вроде:

Matrix products: default
BLAS/LAPACK: /opt/OpenBLAS/lib/libopenblas_haswellp-r0.3.6.dev.so

Чтобы использовать многопоточную обработку, выполните export OPENBLAS_NUM_THREADS=1 перед запуском раздела R. .

ПРИМЕЧАНИЕ. Для процессоров Intel sudo cpupower frequency-set -g performance может повысить производительность. Подробнее читайте на странице https://wiki.archlinux.org/index.php/CPU_frequency_scaling. .

person Pedro Rafael    schedule 25.02.2019
comment
Это выглядит неправильно: OPENBLAS_NUM_THREADS=1. Чтобы получить многопоточность от OpenBLAS, вам нужно более одного потока. Вы также используете устаревшую версию (0.20.0) OpenBLAS. Новые выпуски доступны по адресу sourceforge.net/projects/openblas/files. - person mtall; 26.02.2019
comment
Равно 1 означает количество потоков на ядро. В моем случае 4 ядра с 1 потоком на ядро. - person Pedro Rafael; 26.02.2019
comment
install.packages(ropenblas) rownblas::ropenblas() - person Pedro Rafael; 17.12.2020