【问题标题】:GPU shared memory size is very small - what can I do about it?GPU 共享内存非常小 - 我该怎么办?
【发布时间】:2011-06-26 09:46:44
【问题描述】:

在当今大多数 nVIDIA GPU 上,共享内存(OpenCL 术语中的“本地内存”)的大小仅为 16 KiB。
我有一个应用程序,我需要在其中创建一个包含 10,000 个整数的数组。所以我需要容纳 10,000 个整数 = 10,000 * 4b = 40kb 的内存量。

  • 我该如何解决这个问题?
  • 是否有任何 GPU 具有超过 16 KiB 的共享内存?

【问题讨论】:

    标签: gpu nvidia gpu-shared-memory


    【解决方案1】:

    将共享内存视为显式管理的缓存。您需要将数组存储在全局内存中,并根据需要将其部分缓存在共享内存中,方法是进行多次传递或其他一些方案,以最大限度地减少全局内存的加载和存储次数。

    您如何实现这将取决于您的算法 - 如果您可以详细说明您正在尝试实现的具体内容,您可能会得到一些更具体的建议。

    最后一点 - 请注意共享内存在一个块中的所有线程之间共享 - 每个线程的内存少于 16 kb,除非你有一个对所有线程都通用的数据结构块中的线程。

    【讨论】:

    • +1 通常只使用全局内存会更容易,并且只在代码运行后才考虑使用共享内存进行性能优化。
    【解决方案2】:

    所有计算能力 2.0 及更高版本的设备(大多数在过去一两年内)每个多处理器都有 48KB 的可用共享内存。话虽如此,Paul 的回答是正确的,因为您可能不想将所有 10K 整数加载到单个多处理器中。

    【讨论】:

      【解决方案3】:

      你可以尝试使用cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1})函数。

      如果您更喜欢 L1 而不是 Shared,那么 48KB 将分配给 L1,而 16KB 将分配给 Shared。 如果您更喜欢共享而不是 L1,则 48KB 将用于共享,16KB 将用于 L1。

      用法:

      cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
      matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
      

      【讨论】:

      猜你喜欢
      • 2013-08-30
      • 2017-08-28
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2011-05-22
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多