是否可以通过在GPU上运行具有以下属性的算法来提高性能:
不幸的是,算法在这里显示起来相当复杂。
答案 0 :(得分:1)
我的直觉是积极使用纹理记忆。缓存的好处将击败未合并的全局内存读取一英里。
写入您可能需要添加一些填充等以避免银行冲突。
对数百兆或数字数据的依赖有些令人担忧。你能以某种方式刻上它吗?希望你有一个强大的特斯拉/ Quadro w / oodles RAM。
也就是说,CUDA优化的游戏名称总是要进行实验,剖析/测量,冲洗和重复。
答案 1 :(得分:1)
在开始之前,请记住CUDA中有两层并行性:块和线程。
有数百甚至数千个独立线程 计算期间不需要任何同步
由于每个维度可以启动多达65535个块,因此您可以将cuda中的每个块视为等同于您的“线程”。
每个线程都有一个相对较小(小于200Kb)的本地内存 包含特定于线程的数据的区域。读/写
不幸的是,大多数卡的共享内存限制为每块16k。所以,如果你能弄清楚如何处理这个下限,那就太好了。如果没有,您将需要使用全局内存访问..
每个线程访问一个大的内存块(数百兆字节和 甚至千兆字节)。该内存是只读的
您无法将此类大型数组绑定到纹理或常量内存。因此,在给定的块中,尝试使线程读取连续的数据块以获得最佳性能。
对于每次访问全局内存,至少有两个 访问本地内存将有很多分支 算法
由于您实际上是用cuda中的块替换原始实现中的单个线程,因此您可能需要稍微修改代码以尝试实现“每线程代码”的并行版本。
初看起来可能并不清楚,但请仔细考虑一下。任何具有数百/数千个独立部分且无需同步的算法对于并行实现都很有用,即使使用cuda也是如此。