我正在尝试在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));
}
有没有人对如何做到这一点有任何想法?
答案 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
),请使用cuMemAlloc
和cuMemcpyHtoD
如果要使用运行时API,请使用void *
作为内存指针并将其转换为所需类型。您可以将cudaMalloc
和cudaMemcpy
与运行时API一起使用。
编辑:添加了修改以明确地将CUdeviceptr
投射到void *
。添加了有关驱动程序和设备API的信息。