gpt4 book ai didi

c# - 如何使用 CUdeviceptr 执行 CudaMemcpy

转载 作者:行者123 更新时间:2023-11-30 02:46:01 26 4
gpt4 key购买 nike

我正在尝试在 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),请使用 cuMemAlloccuMemcpyHtoD

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

编辑:添加编辑以显式地将 CUdeviceptr 转换为 void *。添加了有关驱动程序和设备 API 的信息。

关于c# - 如何使用 CUdeviceptr 执行 CudaMemcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com