c++ - 从 R - .C vs .Call 调用 CUDA 编译的 .dll

标签 c++ c r cuda

关注this NVidia blog entry我在 Windows 7 x64 dll 下创建了一个 CUDA 函数。函数定义如下:

extern "C" __declspec(dllexport) void gvectorAdd(double *A, double *B, double *C, int *n)

我可以使用以下命令从 R(v3.2.3 64 位)中成功调用它:

a <- c(1,2,3,4)
b <- c(5,6,7,8)
c <- c(0,0,0,0)
n <- length(c)

path.dll <- "cuda_r_1.dll"
dyn.load(path.dll)

c <- .C("gvectorAdd", 
        as.numeric(a), 
        as.numeric(b), 
        as.numeric(c), 
        as.integer(n),
        PACKAGE="cuda_r_1"
      )[[3]]

我相信我应该使用 .Call 而不是 .C。但是,当我在上面的代码中将 .C(...) 替换为 .Call(...) 时,R session 崩溃。

有人能给我指出正确的方向吗?

最佳答案

您应该更喜欢使用.Call,但是.C.Call 接口(interface)是不同的——.Call 需要所有参数的 SEXP。参见 https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Interface-functions-_002eCall-and-_002eExternal了解更多详情。

换句话说,如果您想转到.Call 界面,您需要更改gvectorAdd 函数。

关于c++ - 从 R - .C vs .Call 调用 CUDA 编译的 .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921274/

相关文章:

r - 一次性将分隔符(但仅限唯一值)拆分为新行?

r - 如何按字典顺序订购我的数据框

r - 更改数据框列表中的名称

c++ - 当数组中的类元素被修改时,它的行为就像是一个拷贝,而不是引用

c++ - 拦截c++异常

c - 如何将 SSE 应用于长度不能保证为 4 的倍数的数组?

makefile - 如何创建 makefile 来编译多个程序

python - 使用某些 OpenCV 函数时出现段错误

c++ - 将字段的偏移量作为模板参数传递给该字段

c++ - C 或 C 中的 gamma 或 log gamma 函数