Ускорете 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 предлага избор между pluggable алтернативи, всички от които са достъпни чрез -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 Optimized BLAS Library) в 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) ropenblas::ropenblas() - person Pedro Rafael; 17.12.2020