Api 如何将Npp8u*转换为CUdeviceptr
我不熟悉cuda驱动程序Api接口,但我认为CUdeviceptr看起来像一个句柄参数。所以我混淆了CUdeviceptr和npp8u*之间的转换Api 如何将Npp8u*转换为CUdeviceptr,api,cuda,driver,npp,Api,Cuda,Driver,Npp,我不熟悉cuda驱动程序Api接口,但我认为CUdeviceptr看起来像一个句柄参数。所以我混淆了CUdeviceptr和npp8u*之间的转换 Npp8u * src; ...... unsigned char temp; temp = src; CUdeviceptr devPtr; ....... devPtr = (CUdeviceptr)temp; 我试着写上面的转换,对吗 通常情况下,您不会明确执行此操作,而是在传递到Cudamaloc时将Npp8u*强制转换为空**: Npp8
Npp8u * src;
......
unsigned char temp;
temp = src;
CUdeviceptr devPtr;
.......
devPtr = (CUdeviceptr)temp;
我试着写上面的转换,对吗 通常情况下,您不会明确执行此操作,而是在传递到Cudamaloc时将Npp8u*强制转换为空**:
Npp8u * src;
int length = ...
cudaMalloc( (void **)(&src), sizeof( Npp8u ) * length );
cuDevicePtr
实际上是一个原始指针,而不是句柄。您可以看到CUDA驱动程序的原始架构师和驱动程序API对此进行了讨论(并在此过程中向我介绍)。因此,如果您有一个现有的“类型化”设备指针,可以安全地将其强制转换为cuDevicePtr
,反之亦然,例如:
cuDevicePtr m;
cuMemAlloc(&m, size);
Npp8U* p = (Npp8U*)(m);
// Pass p to NPP library functions...
是合法的,应该可以工作。在转换为
CUdeviceptr
之前,通过将指针降级到无符号字符
,可以屏蔽src
中除最低有效8位以外的所有位
只要写下:
Npp8u*src代码>
CUdeviceptr devPtr=(CUdeviceptr)(uintpttr_t)src代码>问题是关于驱动程序API的Cudamaloc
不是一个驱动程序API调用。@kunzmi HeyBro!你对此有什么想法吗?谢谢,它成功地编译了。但是“Npp8U*p=(Npp8U*)(m)”,p是错误指针。另一方面,我试过“Npp*p=*(Npp8U**)&m”,它也成功地编译了,p是错误指针。@user2968731:那么你做错了什么。没有看到具体的例子,我无法告诉你。谢谢,我会试试看。