Api 如何将Npp8u*转换为CUdeviceptr

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

我不熟悉cuda驱动程序Api接口,但我认为CUdeviceptr看起来像一个句柄参数。所以我混淆了CUdeviceptr和npp8u*之间的转换

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:那么你做错了什么。没有看到具体的例子,我无法告诉你。谢谢,我会试试看。