关注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/