从 Rcpp 包调用 CUDA API 函数导致段错误
Calling CUDA API functions from Rcpp package causes segfault
我目前正在尝试构建一个与 CUDA 一起工作的 R-Package。
虽然创建包的传统方法可行,但与包的 gputools package, I wanted to try Rcpp 非常相似,因为它在 return 值方面看起来更干净和方便。
包安装到目前为止运行良好,但问题是 第一次调用 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 中执行它实际上给了我错误,这是一个常见的段错误。
谢谢@RalfStubner,产生上述错误的错误确实只是声明了一个从未被 returned 的 return 类型。
所以不用
// [[Rcpp::export]]
Rcpp::NumericMatrix cudaTest()
{
testMalloc();
}
应该是
// [[Rcpp::export]]
void cudaTest()
{
testMalloc();
}
(虽然这是一个相当简单的问题,但在我原来相当大的项目中,错误与不同的设置相同。我认为 cudaMalloc
是问题所在,因为我只能按照自己的方式进行调试通过 with printf
语句,在引入错误部分时完全省略了。在这个较大的项目中,错误是围绕 CUDA 内核启动的包装器,后来被简单地删除了。)
我目前正在尝试构建一个与 CUDA 一起工作的 R-Package。 虽然创建包的传统方法可行,但与包的 gputools package, I wanted to try Rcpp 非常相似,因为它在 return 值方面看起来更干净和方便。
包安装到目前为止运行良好,但问题是 第一次调用 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 中执行它实际上给了我错误,这是一个常见的段错误。
谢谢@RalfStubner,产生上述错误的错误确实只是声明了一个从未被 returned 的 return 类型。
所以不用
// [[Rcpp::export]]
Rcpp::NumericMatrix cudaTest()
{
testMalloc();
}
应该是
// [[Rcpp::export]]
void cudaTest()
{
testMalloc();
}
(虽然这是一个相当简单的问题,但在我原来相当大的项目中,错误与不同的设置相同。我认为 cudaMalloc
是问题所在,因为我只能按照自己的方式进行调试通过 with printf
语句,在引入错误部分时完全省略了。在这个较大的项目中,错误是围绕 CUDA 内核启动的包装器,后来被简单地删除了。)