如何区分共享和全局内存的指针?

Jar*_*ock 5 cuda

在CUDA中,给定指针的值或变量的地址,是否存在内部或另一个API,它将内省指针指向的地址空间?

Jar*_*ock 6

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;
}
Run Code Online (Sandbox Code Playgroud)

1如果通用地址ptr在全局内存空间中,则此函数返回.0如果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;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,本地内存也有`isspacep.local`. (2认同)