如何使用 CUdeviceptr 进行 CudaMemcpy

gum*_*lym 1 c# c++ cuda

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

\n\n

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

\n\n
extern "C" __declspec(dllexport) void __cdecl allocateDeviceMemory(float*, CUdeviceptr,     unsigned int);\n\nextern void allocateDeviceMemory(float* data, CUdeviceptr device_pointer, unsigned int numElements){\ncudaMalloc((void**)&device_pointer,numElements * sizeof(float));\ncudaError_t error = cudaGetLastError();\nprintf("CudaError.... 1  %s\\n", cudaGetErrorString(error));\n\ncudaMemcpy((void*)&device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice);\nerror = cudaGetLastError();\nprintf("CudaError.... 2  %s\\n", cudaGetErrorString(error));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人对如何做到这一点有任何想法吗?

\n

Pav*_*ili 5

改变

cudaMemcpy((void*)&device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice)
Run Code Online (Sandbox Code Playgroud)

cudaMemcpy((void *)device_pointer ,data,numElements * sizeof(float), cudaMemcpyHostToDevice
Run Code Online (Sandbox Code Playgroud)

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


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

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

编辑:添加编辑以显式转换CUdeviceptrvoid *. 添加了有关驱动程序和设备 API 的信息。