c++ CUDA中是否存在与intptr_t和uintptr_t等效的函数

dddzy1tm  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(157)

由于intptr_tuintptr_t是指能够保存 host 指针的整数类型,那么在设备代码中是否可以使用一些等价的类型?
这对于设备端的原子来说特别有用,因为原子函数不接受指向指针类型的指针,因此需要转换(转换为uintptr_t *的任何等价物)。假设设备指针是64位宽,使用unsigned long long *安全吗?
在google搜索时,我看到一些关于CUdeviceptr类型的提及,听起来它可能是intptr_t的等价物,但找不到关于它是什么或如何使用它的讨论或文档。

5uzkadbs

5uzkadbs1#

在谷歌搜索时,我看到一些关于CUdeviceptr类型的提及,听起来它可能相当于intptr_t,但找不到关于它是什么或如何使用它的讨论或文档。
CUdeviceptr实际上与intptr_t非常相似,除了它与int没有特别的关联。CUDA驱动程序API函数通常不接受也不返回常规指针,而是-CUdeviceptr,包含一个地址,在设备上有效,作为一个数字。
由于intptr_tuintptr_t是指能够保存主机指针的整数类型,那么在设备代码中是否可以使用一些等价的类型?
我猜你是想做些不该做的事
这对于设备端的原子特别有用,因为原子函数不接受指向指针类型的指针,因此需要转换(转换为任何与uintptr_t * 等效的值)。
这不仅是指针的问题--而且对于除了那些有特定原子API函数的类型之外的任何类型都是如此。
更好的是-不要自己做,使用:

template <typename T>  KAT_FD T add        (T* address, T val);
template <typename T>  KAT_FD T subtract   (T* address, T val);
template <typename T>  KAT_FD T exchange   (T* address, T val);
template <typename T>  KAT_FD T min        (T* address, T val);
template <typename T>  KAT_FD T max        (T* address, T val);
template <typename T>  KAT_FD T logical_and(T* address, T val);
template <typename T>  KAT_FD T logical_or (T* address, T val);
// etc. etc.

字符串
它会帮你搞定的不需要CUdeviceptr
假设设备指针是64位宽,并使用无符号long long *,是否安全?
sizeof()是您的朋友(我就是这么用的);或者您可以在构建配置时检查(例如,CMake提供了一个check_type_size()命令)。

相关问题