- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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/
我是cuda驱动Api接口(interface)的新手,但我认为CUdeviceptr看起来像一个句柄参数。所以我对CUdeviceptr和npp8u *之间的转换感到困惑。 Npp8u * src;
我是cuda驱动Api接口(interface)的新手,但我认为CUdeviceptr看起来像一个句柄参数。所以我对CUdeviceptr和npp8u *之间的转换感到困惑。 Npp8u * src;
我正在尝试在 CUDA 的 С++ DLL 中做一个包装器,以便能够在 C# 中使用它(是的,我知道有 managedCuda 和 cudafy,但我仍然想尝试这个) 问题是,为了能够将指针引用传回
我正在修改 Video_Codec_SDK_8.0.14 中的 NVTranscoder 项目,以便将一些信号处理工作添加到视频帧中。但是,我在将 GPUMat 转换为 CUdeviceptr 时遇到
cuMemAllocManaged 要求作为其第一个参数提供的指针是 CUdevicptr * 类型(技术上 unsigned int *),但要点使用托管内存是为了能够在主机和设备上操作同一内存地址
我是一名优秀的程序员,十分优秀!