【问题标题】:Accessing a read-only global array as fast as possible with CUDA?使用 CUDA 尽可能快地访问只读全局数组?
【发布时间】:2011-12-22 08:38:11
【问题描述】:

我有一个巨大的数组,必须由不同的线程并行读取。每个线程必须从头到尾读取整个数组中不同位置的不同条目。缓冲区是只读的,所以我认为不需要“关键部分”。

但恐怕这种方法的性能很差。但我没有看到其他方法来做到这一点。我可以将整个数组加载到每个块的共享内存中,但我认为没有足够的共享内存。

有什么想法吗?

编辑:有些人问我为什么必须访问数组的不同部分,所以这里有一些解释:我正在尝试实现"auction algorithm"。在一个内核中,每个线程(人)必须对一个项目进行投标,该项目有一个价格,具体取决于它对该项目的兴趣。每个线程都必须检查它对大数组中给定对象的兴趣,但这不是问题,我可以合并共享内存中的读取。问题是当一个线程选择竞标一个项目时,它必须首先检查它的价格,并且由于要竞标的对象很多,我无法将所有这些信息都放入共享内存中。此外,每个线程都必须访问整个价格缓冲区,因为它们可以对任何对象进行投标。我在这里唯一的优势是缓冲区是只读的。

【问题讨论】:

  • 您的应用程序试图计算什么?可能还有另一种以结构化方式访问数据的方式。
  • 你能在你的内核中添加一个访问模式的例子吗?
  • 我已将问题编辑得更明确!

标签: performance memory cuda


【解决方案1】:

访问全局内存的最快方法是通过合并访问,但是在您的情况下,这可能是不可能的。您可以研究只读的纹理内存,但通常用于空间 2D 访问。

Cuda Best practice guide 第 3.2 节 有关于这个和其他记忆技术的大量信息。

【讨论】:

    【解决方案2】:

    与从全局内存中读取相比,从共享内存中读取要快得多。也许您可以将数组的一个子集加载到块中线程所需的共享内存中。如果块中的线程需要来自数组不同部分的值,则应更改算法,因为这会导致非合并访问很慢。

    此外,在从共享内存中读取时,请注意当两个线程从共享内存中的同一银行读取时发生的银行冲突。纹理内存也可能是一个不错的选择,因为它是缓存的

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 1970-01-01
      • 2021-07-04
      • 2015-08-22
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多