c# - 如何使用 CUdeviceptr 执行 CudaMemcpy

标签 c# c++ cuda

我正在尝试在 CUDA 的 С++ DLL 中做一个包装器,以便能够在 C# 中使用它(是的,我知道有 managedCuda 和 cudafy,但我仍然想尝试这个)

问题是,为了能够将指针引用传回 C#,我不能像往常一样使用 float* 执行 cuda malloc。我试图用 CUdeviceptr 管理一切,但是,即使 cudaMalloc 显然有效(cudaGetLastError 没有给出错误),当我使用 CUdevicptr 变量执行 cudaMemcpy 时它会中断并给出“无效参数”错误。

extern "C" __declspec(dllexport) void __cdecl allocateDeviceMemory(float*, CUdeviceptr,     unsigned int);

extern void allocateDeviceMemory(float* data, CUdeviceptr device_pointer, unsigned int numElements){
cudaMalloc((void**)&device_pointer,numElements * sizeof(float));
cudaError_t error = cudaGetLastError();
printf("CudaError.... 1  %s\n", cudaGetErrorString(error));

cudaMemcpy((void*)&device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice);
error = cudaGetLastError();
printf("CudaError.... 2  %s\n", cudaGetErrorString(error));
}

有没有人知道如何做到这一点?

最佳答案

改变

cudaMemcpy((void*)&device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice)

cudaMemcpy((void *)device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice

CUdeviceptr 本身就是一个设备指针。当您执行 &device_pointer 时,您发送的是指向设备指针的指针。 cudaMalloc 需要一个指向指针的指针并且工作正常。 cudaMemcpy 但是只需要一个设备指针(而不是指向指针的指针)。


  • 如果您想使用驱动程序 API(即使用 CUdeviceptr),请使用 cuMemAlloccuMemcpyHtoD

  • 如果您想使用运行时 API,请为内存指针使用 void * 并将它们转换为所需的类型。您可以将 cudaMalloccudaMemcpy 与运行时 API 一起使用。

编辑:添加编辑以显式地将 CUdeviceptr 转换为 void *。添加了有关驱动程序和设备 API 的信息。

关于c# - 如何使用 CUdeviceptr 执行 CudaMemcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937428/

相关文章:

c# - 如何从Windows(如dxdiag)获取软件和硬件信息?

c++ - 数组大小错误 x64 进程

c++ - 如何以编程方式禁用按钮或使用 Office 功能区 UI 从下拉列表中添加/删除项目

c++ - 在我调用 cuCtxDestroy 之后重用 cuMemAlloc 内存是否安全?

opengl - cudaGraphicsUnregisterResource 中出现崩溃错误

eclipse - 如何使用 eclipse Nsight 仅使用一个 GPU 调试 CUDA

c# - ASP.Net 使用重定向创建服务器端发布到外部网站

c# - 排队方法调用 - 知道怎么做吗?

c# - 如何清除浏览器后退按钮点击 MVC4 中的浏览器缓存?

c++ - 由于 C++03/C++11 中指针数组的常量性而导致的链接错误