全局内存中的大型常量数组

时间:2011-08-13 22:24:10

标签: optimization cuda

是否可以通过在GPU上运行具有以下属性的算法来提高性能:

  1. 有数百甚至数千个独立线程,在计算过程中不需要任何同步
  2. 每个线程都有一个相对较小(小于200Kb)的本地内存区域,其中包含特定于线程的数据。读/写
  3. 每个线程访问一个大内存块(数百兆甚至千兆字节)。此内存为只读
  4. 对于对全局内存的每次访问,将至少有两次访问本地内存
  5. 算法中会有很多分支
  6. 不幸的是,算法在这里显示起来相当复杂。

2 个答案:

答案 0 :(得分:1)

我的直觉是积极使用纹理记忆。缓存的好处将击败未合并的全局内存读取一英里。

写入您可能需要添加一些填充等以避免银行冲突。

对数百兆或数字数据的依赖有些令人担忧。你能以某种方式刻上它吗?希望你有一个强大的特斯拉/ Quadro w / oodles RAM。

也就是说,CUDA优化的游戏名称总是要进行实验,剖析/测量,冲洗和重复。

答案 1 :(得分:1)

在开始之前,请记住CUDA中有两层并行性:块和线程。

  

有数百甚至数千个独立线程   计算期间不需要任何同步

由于每个维度可以启动多达65535个块,因此您可以将cuda中的每个块视为等同于您的“线程”。

  

每个线程都有一个相对较小(小于200Kb)的本地内存   包含特定于线程的数据的区域。读/写

不幸的是,大多数卡的共享内存限制为每块16k。所以,如果你能弄清楚如何处理这个下限,那就太好了。如果没有,您将需要使用全局内存访问..

  

每个线程访问一个大的内存块(数百兆字节和   甚至千兆字节)。该内存是只读的

您无法将此类大型数组绑定到纹理或常量内存。因此,在给定的块中,尝试使线程读取连续的数据块以获得最佳性能。

  

对于每次访问全局内存,至少有两个   访问本地内存将有很多分支   算法

由于您实际上是用cuda中的块替换原始实现中的单个线程,因此您可能需要稍微修改代码以尝试实现“每线程代码”的并行版本。

初看起来可能并不清楚,但请仔细考虑一下。任何具有数百/数千个独立部分且无需同步的算法对于并行实现都很有用,即使使用cuda也是如此。