Optimization 全局存储器中的大常数数组

Optimization 全局存储器中的大常数数组,optimization,cuda,Optimization,Cuda,是否可以通过在GPU上运行具有以下属性的算法来提高性能: 有数百个甚至数千个独立线程,它们在计算过程中不需要任何同步 每个线程都有一个相对较小(小于200Kb)的本地内存区域,其中包含线程特定的数据。读/写 每个线程访问一个大内存块(数百兆字节甚至千兆字节)。这个存储器是只读的 对于对全局内存的每次访问,至少有两次对本地内存的访问 算法中会有很多分支 不幸的是,这里显示的算法相当复杂。我的本能是积极地使用纹理记忆。缓存的好处将比未恢复的全局内存读取快一英里 写操作可能需要添加一些填充等,以避免银

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

  • 有数百个甚至数千个独立线程,它们在计算过程中不需要任何同步
  • 每个线程都有一个相对较小(小于200Kb)的本地内存区域,其中包含线程特定的数据。读/写
  • 每个线程访问一个大内存块(数百兆字节甚至千兆字节)。这个存储器是只读的
  • 对于对全局内存的每次访问,至少有两次对本地内存的访问
  • 算法中会有很多分支

  • 不幸的是,这里显示的算法相当复杂。

    我的本能是积极地使用纹理记忆。缓存的好处将比未恢复的全局内存读取快一英里

    写操作可能需要添加一些填充等,以避免银行冲突

    对数百兆兆或千兆数据的依赖多少令人担忧。你能把它切碎吗?希望你有一个大而结实的特斯拉/夸德罗和大量的公羊


    这就是说,CUDA优化的游戏名称始终是实验、配置/测量、清洗和重复。

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

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

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

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

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

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

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

    对全局内存的每次访问将至少有两次 对本地内存的访问在内存中会有很多分支 算法

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


    乍一看可能不太清楚,但仔细想想。任何有成百上千个独立部分而不需要同步的算法都非常适合并行实现,即使使用cuda

    什么样的电脑?“数百甚至数千个独立线程”-这意味着大量线程上下文切换,尤其是当每个线程处于可运行(在io上未阻塞)状态时。除非这是一个并行计算环境(有数百个处理器),否则你可能会通过一次运行更少的线程来加速你的程序。你能再具体一点吗?或者它将是随机的(或者至少依赖于数据的)不规则访问?thanhtuan它将是依赖于数据的访问。非常分散。在计算过程中,每个线程只访问一次元素。大多数情况下,不同的线程将访问不同的元素。在全局内存的N^2个元素中,每个线程将读取大约N个元素。不幸的是,我手头没有Tesla/Quadro。但是,如果我能获得至少10倍CPU与GPU加速,我会考虑买一个。是的,这种全球记忆让我最担心。但我看不出有什么办法可以避免。每个线程访问这个内存的次数相当多,而且很难预测它将读取哪个特定区域。我希望,如果不同的线程将访问不同的内存区域,它们将不会相互阻塞很多。10倍是很容易实现的。我以前做过1000次,这需要一些思考。如果映射到纹理内存,则读取同一位置的多个线程不是问题。事实上,您可以从缓存中获得一些数据局部性好处,甚至可以超过理论带宽。但是,如果有线程为了写而互相踩踏,那么得到的只是非确定性行为。@peakxu输入数字不是建设性的,特别是当问题的本质仍然是抽象的时。无法组织全局内存存储,以便线程可以读取顺序块。最大顺序块大小为16字节。阅读非常分散。大多数情况下,不同的线程将读取全局内存中的不同块。那么,这是你不得不放弃的另一件事。但是,如果计算足够密集,读取就不应该成为瓶颈。