Cuda 我的内核代码能告诉我它有多少可用的共享内存吗?

Cuda 我的内核代码能告诉我它有多少可用的共享内存吗?,cuda,gpgpu,ptx,gpu-shared-memory,Cuda,Gpgpu,Ptx,Gpu Shared Memory,运行设备端CUDA代码是否可能知道为运行内核网格的每个块分配了多少(静态和/或动态)共享内存 在主机端,您知道启动的内核拥有(或将拥有)多少共享内存,因为您自己设置了该值;但是设备方面呢?将上限编译为该大小很容易,但该信息不可用(除非显式传递)到设备。是否有GPU上的机制来获取它?似乎没有讨论这个问题(在共享内存部分的内部或外部)。TL;医生:是的。使用下面的功能。 这是可能的:该信息可用于特殊寄存器中的内核代码:和 通常,当我们编写内核代码时,我们不需要知道特定的寄存器(特殊的或其他的)-我们

运行设备端CUDA代码是否可能知道为运行内核网格的每个块分配了多少(静态和/或动态)共享内存

在主机端,您知道启动的内核拥有(或将拥有)多少共享内存,因为您自己设置了该值;但是设备方面呢?将上限编译为该大小很容易,但该信息不可用(除非显式传递)到设备。是否有GPU上的机制来获取它?似乎没有讨论这个问题(在共享内存部分的内部或外部)。

TL;医生:是的。使用下面的功能。 这是可能的:该信息可用于特殊寄存器中的内核代码:和

通常,当我们编写内核代码时,我们不需要知道特定的寄存器(特殊的或其他的)-我们编写C/C++代码。即使我们确实使用这些寄存器,CUDA编译器也会通过保存其值的函数或结构对我们隐藏这些寄存器。例如,当我们使用值
threadIdx.x
时,实际上我们正在访问特殊寄存器
%tid.x
,该寄存器针对块中的每个线程设置不同。当您查看编译的PTX代码时,可以看到这些寄存器“正在运行”。ArrayFire写了一篇很好的博客文章,其中有一些成功的例子:

但是,如果CUDA编译器对我们“隐藏”寄存器的使用,我们怎么能在幕后坚持使用它们,用那些前缀名访问它们呢?好吧,下面是方法:

__forceinline__ __device__ unsigned dynamic_smem_size()
{
    unsigned ret; 
    asm volatile ("mov.u32 %0, %dynamic_smem_size;" : "=r"(ret));
    return ret;
}
对于
%total\u smem\u size
,还有一个类似的函数。此函数使编译器添加显式PTX指令,就像主机代码可以使用asm直接发出CPU汇编指令一样。此函数应始终是内联的,因此在分配

x = dynamic_smem_size();
实际上,您只需将特殊寄存器的值分配给
x

TL;医生:是的。使用下面的功能。 这是可能的:该信息可用于特殊寄存器中的内核代码:和

通常,当我们编写内核代码时,我们不需要知道特定的寄存器(特殊的或其他的)-我们编写C/C++代码。即使我们确实使用这些寄存器,CUDA编译器也会通过保存其值的函数或结构对我们隐藏这些寄存器。例如,当我们使用值
threadIdx.x
时,实际上我们正在访问特殊寄存器
%tid.x
,该寄存器针对块中的每个线程设置不同。当您查看编译的PTX代码时,可以看到这些寄存器“正在运行”。ArrayFire写了一篇很好的博客文章,其中有一些成功的例子:

但是,如果CUDA编译器对我们“隐藏”寄存器的使用,我们怎么能在幕后坚持使用它们,用那些前缀名访问它们呢?好吧,下面是怎么做到的:

__forceinline__ __device__ unsigned dynamic_smem_size()
{
    unsigned ret; 
    asm volatile ("mov.u32 %0, %dynamic_smem_size;" : "=r"(ret));
    return ret;
}
对于
%total\u smem\u size
,还有一个类似的函数。此函数使编译器添加显式PTX指令,就像主机代码可以使用asm直接发出CPU汇编指令一样。此函数应始终是内联的,因此在分配

x = dynamic_smem_size();
实际上,您只需将特殊寄存器的值分配给
x