Ich versuche, eine QR-Dekomposition (LAPACKE_dgeqrf) in R auf einem Linux-Rechner (CentOS) mit einem C++ - Programm, das mit Rcpp Schnittstelle ist. Leider sehe ich nur 100% mit top. Dies geschieht auch auf einem Red Hat Enterprise Linux Server. Das C++ - Programm (mit LAPACKE_dgeqrf) wird jedoch bei nthreads * 100% ausgeführt, wenn es vom Terminal gestartet wird (unabhängig von R). Ich kompilierte OpenBLAS mitOpenBLAS-Routine von R/Rcpp verwendet läuft nur auf einem einzigen Kern in Linux
NO_AFFINITY=1
und versuchte
export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=4
export OMP_NUM_THREADS=4
export OPENBLAS_MAIN_FREE=1
Nichts funktioniert. Auf einem Mac funktioniert alles einwandfrei. 'mcaffinity()' aus dem parallelen R-Paket gibt NULL zurück. Ich baute R
configure 'CFLAGS=-g -O3 -Wall -pedantic' 'CXXFLAGS=-g -O3 -Wall -pedantic' 'FCFLAGS=-g -O3' 'F77FLAGS=-g -O3' '--with-system-zlib' '--enable-memory-profiling'
Meine C++ Code:
#include <Rcpp.h>
#include <lapacke.h>
#include <cblas.h>
//[[Rcpp::export]]
Rcpp::NumericMatrix QRopenblas(Rcpp::NumericMatrix X)
{
// Declare variables
int n_rows = X.nrow(), n_cols = X.ncol(), min_mn = std::min(n_rows, n_cols);
Rcpp::NumericVector tau(min_mn);
// Perform QR decomposition
LAPACKE_dgeqrf(CblasColMajor, n_rows, n_cols, X.begin(), n_rows, tau.begin());
return X;
}
Mein R Code:
PKG_LIBS <- '/pathto/openblas/lib/libopenblas.a'
PKG_CPPFLAGS <- '-I/pathto/openblas/include'
Sys.setenv(PKG_LIBS = PKG_LIBS , PKG_CPPFLAGS = PKG_CPPFLAGS)
Rcpp::sourceCpp('/pathto/QRopenblas.cpp', rebuild = TRUE)
n_row <- 4000
n_col <- 4000
A <- matrix(rnorm(n_row * n_col), n_row, n_col)
res <- QRopenblas(A)
Hm. Ich würde es vereinfachen: Versuchen Sie ein kleines C++ Standaolon, sehen Sie, ob das funktioniert. Rcpp legt die Anzahl der Kerne nicht fest bzw. setzt sie zurück, und Sie scheinen das richtige env zu verwenden. Vars. –
Ich habe versucht, ein eigenständiges C-Programm und es hat funktioniert :-) Ich sehe mehr als 100% mit Top. Es muss ein Problem mit R sein. Hatten Sie nicht ein ähnliches Problem wie hier beschrieben: http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2012-June/003903.html – chris
Ja. Da war etwas - hier ist irgendwo ein Post von Claudia Beleites. Suchen Sie nach OpenBLAS und parallel. Und ich denke, jemand (Simon?) Schrieb ein Paket oder eine Funktion, um dies zu setzen. –