使用devtools构建导入cuda代码的R包

使用devtools构建导入cuda代码的R包,r,cuda,rcpp,devtools,R,Cuda,Rcpp,Devtools,我试图利用gpu机器来提高矩阵乘法运算的性能 我试图理解和利用cuda代码,并使用devtools在R包中构建它 我所做的是编写一个名为matrixMultiplication.cu的cuda文件: #include <stdio.h> #include <stdlib.h> #include <assert.h> #define BLOCK_SIZE 16 __global__ void runGpuMatrixMult(double *a, doub

我试图利用
gpu
机器来提高矩阵乘法运算的性能

我试图理解和利用
cuda
代码,并使用
devtools
R
包中构建它

我所做的是编写一个名为matrixMultiplication.cu的
cuda
文件:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define BLOCK_SIZE 16


__global__ void runGpuMatrixMult(double *a, double *b, double *c, int m, int n, int k)
{
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int col = blockIdx.x * blockDim.x + threadIdx.x;
    int sum = 0;
    if( col < k && row < m)
    {
        for(int i = 0; i < n; i++)
        {
            sum += a[row * n + i] * b[i * k + col];
        }
        c[row * k + col] = sum;
    }
}

extern "C"
void gpuMatrixMult(double &A, double &B, double &C, int& m, int& n, int& k) {
    // allocate memory in host RAM
    double *h_A, *h_B, *h_C;
    cudaMallocHost((void **) &h_A, sizeof(int)*m*n);
    cudaMallocHost((void **) &h_B, sizeof(int)*n*k);
    cudaMallocHost((void **) &h_C, sizeof(int)*m*k);

    // Allocate memory space on the device
    int *d_A, *d_B, *d_C;
    cudaMalloc((void **) &d_A, sizeof(int)*m*n);
    cudaMalloc((void **) &d_B, sizeof(int)*n*k);
    cudaMalloc((void **) &d_C, sizeof(int)*m*k);

    // copy matrix A and B from host to device memory
    cudaMemcpy(d_A, h_A, sizeof(int)*m*n, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, sizeof(int)*n*k, cudaMemcpyHostToDevice);

    unsigned int grid_rows = (m + BLOCK_SIZE - 1) / BLOCK_SIZE;
    unsigned int grid_cols = (k + BLOCK_SIZE - 1) / BLOCK_SIZE;
    dim3 dimGrid(grid_cols, grid_rows);
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);

    // Launch kernel
    runGpuMatrixMult<<<dimGrid, dimBlock>>>(d_A, d_B, d_C, m, n, k);

    // Transfer results from device to host
    cudaMemcpy(h_C, d_C, sizeof(int)*m*k, cudaMemcpyDeviceToHost);
    cudaThreadSynchronize();

    // free memory
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);
    cudaFreeHost(h_A);
    cudaFreeHost(h_B);
    cudaFreeHost(h_C);
    return 0;
}
最后,我有一个名为
utils.R
的R文件,它有一个调用
gpuMatrixMultCaller
的包装器
函数

#' gpuMatrixMultWrapper calls matrixUtils.cpp::gpuMatrixMultCaller which runs a GPU matrix multiplication
#' Returns the product of the input matrices
gpuMatrixMultWrapper <- function(A,B)
{
  m <- nrow(A)
  n <- ncol(A)
  k <- ncol(B)
  C <- bigmemory::deepcopy(A)
  gpuMatrixMultCaller(A, B, C, m, n, k)
  return(C)
}
名称空间
文件的底部有:
useDynLib(utils)
,我在
说明
文件中指定:
链接到:Rcpp,RcppArmadillo

因此,我的问题是:

  • 甚至可以构建一个导入
    cuda
    代码的
    R
    pacakge
    ?使用
    devtools
    ?如果不是,是否应在
    cpp
    文件中对
    cuda
    零件进行编码

  • 如果是这样,我错过了什么?我尝试在
    matrixUtils.cpp
    中添加
    #include
    ,但得到:
    致命错误:cuda.h:没有这样的文件或目录


  • 非常感谢

    尝试使用链接到cuda的tcc构建共享对象文件utils.so。然后
    dyn.load(“utils.so”)
    。为什么要使用C链接呢?我没有做出任何决定。这可能是devtool的默认设置。嗯?您编写了CUDA代码,我猜您在整个过程中都添加了
    extern“C”
    。你为什么选择这样做?
    #' gpuMatrixMultWrapper calls matrixUtils.cpp::gpuMatrixMultCaller which runs a GPU matrix multiplication
    #' Returns the product of the input matrices
    gpuMatrixMultWrapper <- function(A,B)
    {
      m <- nrow(A)
      n <- ncol(A)
      k <- ncol(B)
      C <- bigmemory::deepcopy(A)
      gpuMatrixMultCaller(A, B, C, m, n, k)
      return(C)
    }
    
    Error in dyn.load(dllfile) : 
      unable to load shared object '/home/code/packages/utils/src/utils.so':
      /home/code/packages/utils/src/utils.so: undefined symbol: gpuMatrixMult