CUDA 头文件sm_20_intrinsics.h
定义函数
__device__ unsigned int __isGlobal(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.global p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
该函数返回1
如果通用地址ptr
位于全局内存空间中。
它返回0
if ptr
位于共享、本地或常量内存空间中。
PTX指令isspacep
承担繁重的工作。看起来我们应该能够以这种方式构建类似的函数:
__device__ unsigned int __isShared(const void *ptr)
{
unsigned int ret;
asm volatile ("{ \n\t"
" .reg .pred p; \n\t"
" isspacep.shared p, %1; \n\t"
" selp.u32 %0, 1, 0, p; \n\t"
#if (defined(_MSC_VER) && defined(_WIN64)) || defined(__LP64__)
"} \n\t" : "=r"(ret) : "l"(ptr));
#else
"} \n\t" : "=r"(ret) : "r"(ptr));
#endif
return ret;
}
Update:
__isGlobal()
和别的地址空间谓词函数中描述了CUDA C++ 编程指南 https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#address-space-predicate-functions.