Note that there are some explanatory texts on larger screens.

plurals
  1. PORcpp and CULA: segmentation fault
    primarykey
    data
    text
    <p>I extracted the relevant bits from the <em>gputools R</em>-package to run a QR decomposition on my GPU using <em>Rcpp</em> by dynamically loading a shared library that links to <em>culatools</em>. Everything runs smoothly in the terminal and <em>R.app</em> on my Mac. The results agree with <em>R</em>'s <em>qr()</em> function, but the problem is that a segmentation fault occurs on exiting <em>R.app</em> (the error does not occur when using the terminal):</p> <pre><code>*** caught segfault *** address 0x10911b050, cause 'memory not mapped' </code></pre> <p>I think I narrowed down the problem to the pointers 'a' and 'tau' in the .c file that links to <em>culatools</em>:</p> <pre><code>#include&lt;cula.h&gt; void gpuQR(const int *m, const int *n, float *a, const int *lda, float *tau) { culaInitialize(); culaSgeqrf(m[0], n[0], a, lda[0], tau); culaShutdown(); } </code></pre> <p>I compiled the .c file on my Mac using:</p> <pre><code>/usr/local/cuda/bin/nvcc -gencode arch=compute_10,code=sm_10 -gencode arch=compute_11,code=sm_11 -gencode arch=compute_12,code=sm_12 -gencode arch=compute_13,code=sm_13 -gencode arch=compute_20,code=sm_20 -c -I. -I/usr/local/cula/include -m64 -Xcompiler -fPIC gpuQR.c -o gpuQR.o /usr/local/cuda/bin/nvcc -gencode arch=compute_10,code=sm_10 -gencode arch=compute_11,code=sm_11 -gencode arch=compute_12,code=sm_12 -gencode arch=compute_13,code=sm_13 -gencode arch=compute_20,code=sm_20 -shared -m64 -Xlinker -rpath,/usr/local/cula/lib64 -L/usr/local/cula/lib64 -lcula_core -lcula_lapack -lcublas -o gpuQR.so gpuQR.o </code></pre> <p>I wrote a .cpp file that uses <em>Rcpp</em> and dynamically loads the shared library gpuQR.so:</p> <pre><code>#include &lt;Rcpp.h&gt; #include &lt;dlfcn.h&gt; using namespace Rcpp; using namespace std; typedef void (*func)(int*, int*, float*, int*, float*); RcppExport SEXP gpuQR_Rcpp(SEXP x_, SEXP n_rows_, SEXP n_cols_) { vector&lt;float&gt; x = as&lt;vector&lt;float&gt; &gt;(x_); int n_rows = as&lt;int&gt;(n_rows_); int n_cols = as&lt;int&gt;(n_cols_); vector&lt;float&gt; scale(n_cols); void* lib_handle = dlopen("path/gpuQR.so", RTLD_LAZY); if (!lib_handle) { Rcout &lt;&lt; dlerror() &lt;&lt; endl; } else { func gpuQR = (func) dlsym(lib_handle, "gpuQR"); gpuQR(&amp;n_rows, &amp;n_cols, &amp;(x[0]), &amp;n_rows, &amp;(scale[0])); } dlclose(lib_handle); for(int ii = 1; ii &lt; n_rows; ii++) { for(int jj = 0; jj &lt; n_cols; jj++) { if(ii &gt; jj) { y[ii + jj * n_rows] *= scale[jj]; } } } return wrap(x); } </code></pre> <p>I compiled the .cpp file in <em>R</em> using:</p> <pre><code>library(Rcpp) PKG_LIBS &lt;- sprintf('%s $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)', Rcpp:::RcppLdFlags()) PKG_CPPFLAGS &lt;- sprintf('%s', Rcpp:::RcppCxxFlags()) Sys.setenv(PKG_LIBS = PKG_LIBS , PKG_CPPFLAGS = PKG_CPPFLAGS) R &lt;- file.path(R.home(component = 'bin'), 'R') file &lt;- 'path/gpuQR_Rcpp.cpp' cmd &lt;- sprintf('%s CMD SHLIB %s', R, paste(file, collapse = ' ')) system(cmd) </code></pre> <p>and ran an example:</p> <pre><code>dyn.load('path/gpuQR_Rcpp.so') set.seed(100) A &lt;- matrix(rnorm(9), 3, 3) n_row &lt;- nrow(A) n_col &lt;- ncol(A) res &lt;- .Call('gpuQR_Rcpp', c(A), n_row, n_col) matrix(res, n_row, n_col) [,1] [,2] [,3] [1,] 0.5250958 -0.8666927 0.8594266 [2,] -0.2504899 -0.3878644 -0.1277837 [3,] 0.1502908 0.4742033 -0.8804248 qr(A)$qr [,1] [,2] [,3] [1,] 0.5250957 -0.8666925 0.8594266 [2,] -0.2504899 -0.3878643 -0.1277838 [3,] 0.1502909 0.4742033 -0.8804247 </code></pre> <p>Does anybody have an idea how to fix the segmentation fault?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload