Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中线性代数的MAGMA和Rcpp_R_Cuda_Rcpp_Cula_Magma - Fatal编程技术网

R中线性代数的MAGMA和Rcpp

R中线性代数的MAGMA和Rcpp,r,cuda,rcpp,cula,magma,R,Cuda,Rcpp,Cula,Magma,我想知道是否有人试图使用CPU和GPU来加速R中的线性代数运算?我上个月尝试过,它与Rcpp一起工作,但culatools是一种商业产品,需要花钱才能访问所有功能 在修补了culatools之后,使用Rcpp和MAGMA非常简单。以下是.cpp文件: #include<Rcpp.h> #include<magma.h> using namespace Rcpp; RcppExport SEXP gpuQR_magma(SEXP X_) { // Inp

我想知道是否有人试图使用CPU和GPU来加速R中的线性代数运算?我上个月尝试过,它与Rcpp一起工作,但culatools是一种商业产品,需要花钱才能访问所有功能

在修补了culatools之后,使用Rcpp和MAGMA非常简单。以下是.cpp文件:

#include<Rcpp.h>
#include<magma.h>

using namespace Rcpp;

RcppExport SEXP gpuQR_magma(SEXP X_)
{    
    // Input
    NumericMatrix X(X_);

    // Initialize magma and cublas
    magma_init();
    cublasInit();

    // Declare variables 
    int info, lwork, n_rows = X.nrow(), n_cols = X.ncol(), min_mn = min(n_rows, n_cols);
    double tmp[1];
    NumericVector scale(min_mn);

    // Query workspace size
    magma_dgeqrf(n_rows, n_cols, &(X[0]), n_rows, &(scale[0]), &(work[0]), -1, &info); 
    lwork = work[0];
    NumericVector work(lwork);

    // Run QR decomposition
    magma_dgeqrf(n_rows, n_cols, &(X[0]), n_rows, &(scale[0]), &(work[0]), lwork, &info);

    // Scale factor result    
    for(int ii = 1; ii < n_rows; ii++)
    {
        for(int jj = 0; jj < n_cols; jj++)
        {
            if(ii > jj) { X[ii + jj * n_rows] *= scale[jj]; }
        }
    }

    // Shutdown magma and cublas    
    magma_finalize();
    cublasShutdown();

    // Output  
    return wrap(X);
}
可以使用以下方法将文件从R编译到共享库中:

library(Rcpp)  
PKG_LIBS <- sprintf('-Wl,-rpath,/usr/local/magma/lib -L/usr/local/magma/lib -lmagma /usr/local/magma/lib/libmagma.a -Wl,-rpath,/usr/local/cuda-5.5/lib64 %s', Rcpp:::RcppLdFlags()) 
PKG_CPPFLAGS <- sprintf('-DADD_ -DHAVE_CUBLAS -I/usr/local/magma/include -I/usr/local/cuda-5.5/include %s', Rcpp:::RcppCxxFlags())  
Sys.setenv(PKG_LIBS = PKG_LIBS , PKG_CPPFLAGS = PKG_CPPFLAGS) 
R <- file.path(R.home(component = 'bin'), 'R') 
file <- '/path/gpuQR_magma.cpp'
cmd <- sprintf('%s CMD SHLIB %s', R, paste(file, collapse = ' '))
system(cmd)
现在可以在R中调用共享库。将结果与R的qr进行比较,得出:

以下是使用NVIDIA GeForce GTX 675MX GPU和960个CUDA内核和OpenBLAS的基准测试结果:

n_row <- 3000; n_col <- 3000
A <- matrix(rnorm(n_row * n_col), n_row, n_col)
B <- A; dim(B) <- NULL

res <- benchmark(.Call('gpuQR_magma', A), .Call('gpuQR_cula', B, n_row, n_col), qr(A), columns = c('test', 'replications', 'elapsed', 'relative'), order = 'relative')

                                   test replications elapsed relative
2  .Call("gpuQR_cula", B, n_row, n_col)          100  18.704    1.000
1               .Call("gpuQR_magma", A)          100  70.461    3.767
3                                 qr(A)          100 985.411   52.685

在这个例子中,似乎岩浆比火山灰要慢一点。然而,MAGMA提供了内存不足的实现,这是我非常重视的,因为只有1Gb的GPU内存。

Rcpp的作者鼓励有像您这样好例子的人发表文章,分享像您这样的好例子。从我的观点来看,你的东西应该在那里占有一席之地。。。让我们看看他们是怎么想的现有的CRAN包,比如WideLm,它使用Rcpp从R到CUDA的基于C的API;我们可以很容易地对岩浆做同样的处理。实际上,有。但它不使用Rcpp。我张贴了我的代码以供以后参考。关于MAGMA的文档非常少,甚至在将其与Rcpp.Doh一起使用时更薄。应该记得CRAN包magma。是的,我把这个包作为我代码的起点。向Rcpp图库提交Rcpp/MAGMA示例有意义吗?
n_row <- 3000; n_col <- 3000
A <- matrix(rnorm(n_row * n_col), n_row, n_col)
B <- A; dim(B) <- NULL

res <- benchmark(.Call('gpuQR_magma', A), .Call('gpuQR_cula', B, n_row, n_col), qr(A), columns = c('test', 'replications', 'elapsed', 'relative'), order = 'relative')

                                   test replications elapsed relative
2  .Call("gpuQR_cula", B, n_row, n_col)          100  18.704    1.000
1               .Call("gpuQR_magma", A)          100  70.461    3.767
3                                 qr(A)          100 985.411   52.685