【问题标题】:How to do CudaMemcpy using CUdeviceptr如何使用 CUdeviceptr 进行 CudaMemcpy
【发布时间】:2014-05-29 15:48:49
【问题描述】:

我正在尝试在 С++ DLL 中为 CUDA 做一个包装器,以便能够在 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));
}

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

【问题讨论】:

    标签: c# c++ cuda


    【解决方案1】:

    改变

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

    【讨论】:

    • 嗯,实际上,我首先尝试过,它给了我以下编译错误:“CUdeviceptr”类型的参数与“void *”类型的参数不兼容这就是我尝试使用演员
    • 将 device_pointer 转换为 void* 但不要引用它,所以就像 Pavan Yalamanchili 的答案中的第一行代码但没有“&”
    • @gumlym 你可以像 kunzmi 提到的那样明确地投射它们。但是,理想情况下,您应该使用驱动程序 API 或设备 API。不要试图混合它们。查看我的编辑以获取更多信息。
    猜你喜欢
    • 2018-03-21
    • 2022-07-12
    • 2013-05-12
    • 1970-01-01
    • 2014-04-10
    • 2013-05-10
    • 2013-11-13
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多