使用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