由于intptr_t
和uintptr_t
是指能够保存 host 指针的整数类型,那么在设备代码中是否可以使用一些等价的类型?
这对于设备端的原子来说特别有用,因为原子函数不接受指向指针类型的指针,因此需要转换(转换为uintptr_t *
的任何等价物)。假设设备指针是64位宽,使用unsigned long long *
安全吗?
在google搜索时,我看到一些关于CUdeviceptr
类型的提及,听起来它可能是intptr_t
的等价物,但找不到关于它是什么或如何使用它的讨论或文档。
1条答案
按热度按时间5uzkadbs1#
在谷歌搜索时,我看到一些关于CUdeviceptr类型的提及,听起来它可能相当于
intptr_t
,但找不到关于它是什么或如何使用它的讨论或文档。CUdeviceptr
实际上与intptr_t
非常相似,除了它与int
没有特别的关联。CUDA驱动程序API函数通常不接受也不返回常规指针,而是-CUdeviceptr
,包含一个地址,在设备上有效,作为一个数字。由于
intptr_t
和uintptr_t
是指能够保存主机指针的整数类型,那么在设备代码中是否可以使用一些等价的类型?我猜你是想做些不该做的事
这对于设备端的原子特别有用,因为原子函数不接受指向指针类型的指针,因此需要转换(转换为任何与uintptr_t * 等效的值)。
这不仅是指针的问题--而且对于除了那些有特定原子API函数的类型之外的任何类型都是如此。
更好的是-不要自己做,使用:
字符串
它会帮你搞定的不需要
CUdeviceptr
假设设备指针是64位宽,并使用无符号long long *,是否安全?
sizeof()
是您的朋友(我就是这么用的);或者您可以在构建配置时检查(例如,CMake提供了一个check_type_size()
命令)。