从Rcpp包调用CUDA API函数会导致段错误

时间:2018-04-16 11:59:31

标签: c++ r cuda rcpp

我目前正在尝试构建一个与CUDA配合使用的R-Package。 虽然传统的创建包的方法很有用,就像gputools包一样,我想尝试Rcpp包,因为它看起来更干净,更方便。

到目前为止,软件包安装运行良好,但问题是首次调用CUDA API函数(例如cudaMalloc())会导致我的RStudio崩溃。

我创建了一个minimal example来说明我的情况。

就像

一样简单
#include <Rcpp.h>
#include "cudaTest.h"
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::NumericMatrix cudaTest()
{
  testMalloc();
}

#include <cudaTest.h>
#include "cuda_runtime.h"
#include <cuda.h>

void testMalloc()
{
  size_t
    fbytes = sizeof(double);
  double
    *d_mat;

    cudaMalloc((void**)&d_mat, 200*50*fbytes);
    cudaFree(d_mat);
}

关于我做错的任何想法?这种方式是否支持集成?

编辑: 在命令行(R CMD INSTALL)上安装软件包并在R REPL中执行它实际上给了我错误,这是一个常见的段错误。

Segfault after executing example

1 个答案:

答案 0 :(得分:1)

谢谢@RalfStubner,产生上述错误的错误确实只是从未返回的返回类型的声明。

所以而不是

// [[Rcpp::export]]
Rcpp::NumericMatrix cudaTest()
{
  testMalloc();
}

它应该是

// [[Rcpp::export]]
void cudaTest()
{
  testMalloc();
}

(虽然这是一个相当简单的问题,在我原来相当大的项目中,错误与不同的设置相同。我认为cudaMalloc是问题所在,因为我只能调试我的方式printf语句,在引入错误部分时被完全省略。在这个较大的项目中,错误是CUDA内核启动的包装,之后就被删除了。)