1

我正在编写一个 CUDA 内核,它需要为每个线程维护一个小的关联数组。小,我的意思是最坏情况下最多 8 个元素,以及两个左右的预期条目数;所以没什么花哨的;只是一个键数组和一个值数组,索引和插入是通过对所述数组的循环进行的。

现在我通过线程本地内存来做到这一点;即标识符[大小];其中 size 是编译时间常数。现在听说在某些情况下,该存储器存储在片外,而在某些情况下,它存储在片内。显然我想要后者,在任何情况下。我知道我可以通过一个共享内存块来实现这一点,我让每个线程在自己的私有块上工作;但真的吗?我不想在线程之间共享任何东西,这将是一个可怕的组合。

这个内存去向的具体规则是什么?我似乎找不到任何来自 nvidia 的词。作为记录,我正在使用 CUDA5 并以开普勒为目标。

4

1 回答 1

4

局部变量要么存储在寄存器中,要么存储在片外内存中(为计算能力 >=2.0 而缓存)。

如果所有数组索引都是常量并且可以在编译时确定,则寄存器仅用于数组,因为该体系结构无法在运行时对寄存器进行索引访问。

在您的情况下,键的数量可能足够小以使用寄存器(并容忍寄存器压力的增加)。展开数组访问上的所有循环,以允许编译器将键放在寄存器中,并使用cuobjdump -sass它来检查它是否确实如此。

如果您不想花费寄存器,您可以选择具有每个线程偏移量的共享内存(但请检查用于将每个线程索引保存到共享内存中的附加寄存器不会超过您使用的键数)正如您所提到的,或者什么都不做并使用片外“本地”内存(真正的“全局”内存,只有不同的寻址方案),希望缓存能够发挥作用。

如果您希望缓存保存键和值,并且不使用太多共享内存,那么选择 48kB 缓存/16kB 共享内存设置而不是使用cudaDeviceSetCacheConfig().

于 2012-09-20T11:40:23.170 回答