调用 CUDA 编译.dll从 R - .C 与 .叫

calling CUDA compiled .dll from R - .C vs .Call

本文关键字:CUDA 编译 dll 调用      更新时间:2023-10-16

通过遵循此NVidia博客条目,我在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 会话崩溃。

有人可以指出我正确的方向吗?

你应该

更喜欢使用.Call,但.C.Call接口是不同的 - .Call期望所有参数都有SEXP。有关更多详细信息,请参阅 https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Interface-functions-_002eCall-and-_002eExternal。

换句话说,如果要移动到.Call界面,则需要更改gvectorAdd功能。