【问题标题】:Calling CUDA API functions from Rcpp package causes segfault从 Rcpp 包调用 CUDA API 函数会导致段错误
【发布时间】:2018-04-16 11:59:30
【问题描述】:

我目前正在尝试构建一个适用于 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 中执行它实际上给了我错误,这是一个常见的段错误。

【问题讨论】:

  • 您可以使用 Rcpp 和 CUDA 查看其他包;也许gpuR 有帮助。我还发现 ArrayFire 抽象很有帮助,请参阅 this Rcpp Gallery post
  • 我想看看你在 github 上的项目,但它没有构建。它需要外部系统库。可能值得添加一个自述文件以及如何安装它们。
  • @SymbolixAU 我试图创建一个带有依赖项的 README,希望它就足够了。由于我的机器上已经设置了所有内容,因此很难测试是否缺少任何内容。
  • @DirkEddelbuettel 感谢您的意见,但 gpuR 不使用 CUDA 而是使用 OpenCL 来访问 GPU。此外,该项目的目标是保持与 CUDA 本身非常接近以进行基准测试。
  • 你能用gdb 运行它来查看段错误发生在哪里吗?顺便说一句,您可能应该使用void cudaTest(),因为该函数不返回任何内容。

标签: c++ r cuda rcpp


【解决方案1】:

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

所以不是

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

应该是

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

(虽然这是一个相当简单的问题,但在我最初的相当大的项目中,错误与不同的设置相同。我认为cudaMalloc 是问题,因为我只能使用@987654324 进行调试@ 语句,在引入错误部分时完全省略了。在这个更大的项目中,错误是围绕启动 CUDA 内核的包装,后来被简单地删除了。)

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 2019-11-21
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多