我正在尝试在 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
),请使用cuMemAlloc
和cuMemcpyHtoD
如果您想使用运行时 API,请为内存指针使用
void *
并将它们转换为所需的类型。您可以将cudaMalloc
和cudaMemcpy
与运行时 API 一起使用。
编辑:添加编辑以显式地将 CUdeviceptr
转换为 void *
。添加了有关驱动程序和设备 API 的信息。
关于c# - 如何使用 CUdeviceptr 执行 CudaMemcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937428/