如何使用CUdeviceptr进行CudaMemcpy

时间:2014-05-29 15:48:50

标签: c# c++ cuda

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

问题是,为了能够将指针引用传递回c#,我不能像往常一样用浮动*做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));
}

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

1 个答案:

答案 0 :(得分:3)

更改

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的信息。