我正在编写一个CUDA内核,需要为每个线程维护一个小的关联数组。从小到大,我的意思是8个元素最大的最坏情况,以及预期的两个左右的条目数;没有什么花哨的;只是一个键数组和一个值数组,索引和插入通过所述数组上的循环发生。
现在我通过线程本地内存来做到这一点;这是标识符[size];其中size是编译时常量。现在我听说在某些情况下这个存储器存储在片外,在某些情况下它存储在芯片上。在任何情况下,显然我都想要后者。我知道我可以通过一个共享内存块实现这一点,我让每个线程都在自己的私有块上工作;但真的吗?我不想在线程之间分享任何东西,这将是一个可怕的kludge。
这段记忆的规则究竟是什么?我似乎无法从nvidia找到任何消息。为了记录,我正在使用CUDA5并且目标是开普勒。
答案 0 :(得分:3)
局部变量存储在寄存器中,或者(缓存用于计算能力> = 2.0)片外存储器。
如果所有数组索引都是常量且可以在编译时确定,则寄存器仅用于数组,因为体系结构无法在运行时对索引进行索引访问。
在这种情况下,键的数量可能小到足以使用寄存器(并且容忍寄存器压力的增加)。在数组访问中展开所有循环以允许编译器将密钥放在寄存器中,并使用cuobjdump -sass
进行检查。
如果您不想花费寄存器,您可以选择具有每线程偏移量的共享内存(但检查用于将每个线程索引保存到共享内存中的附加寄存器不会超过键的数量正如你所提到的那样,或者什么也不做,并使用片外“本地”内存(真正的“全局”内存只有不同的寻址方案)希望缓存能够完成它的工作。
如果您希望缓存保存密钥和值,并且不使用太多共享内存,则使用{{3>在默认的16kB / 48kB分割上选择48kB缓存/ 16kB共享内存设置可能会有所帮助}}