【问题标题】:OpenCL - Local Memory efficiencyOpenCL - 本地内存效率
【发布时间】:2013-07-30 01:25:31
【问题描述】:

我有一个 AMD GPU,我想实现“矩阵转置”示例。想象一下两种实施方案:

1)

  • 从全局内存读取(当前位置)

  • 写入全局内存(目标位置)

2)

  • 从全局内存中读取(当前位置)

  • 写入本地内存

  • 从本地内存读取

  • 写入全局内存(目标位置)

假设我为这两种解决方案选择了最佳的工作组规模。 顺便说一下,第二种算法利用了协同写入本地内存的优势。

最后,令人惊讶的是,第二种情况的速度是第一种情况的两倍。我就是不明白为什么?

我可以看到,在第一个中,我们对全局内存进行了 1 次读取和 1 次写入,而在第 2 次中,除了全局内存操作之外,我们还有 1 次读取和 1 次写入本地内存,怎么可能更快?

如果有人在这种情况下帮助我,我会很高兴。

提前谢谢你:-)

【问题讨论】:

    标签: opencl


    【解决方案1】:

    我有一个 AMD GPU,我想实现“矩阵转置”示例。

    (以防万一您不知道,nVidia SDK 包含一个 OpenCL 矩阵乘法示例(也许 AMD APP 也有一个),因此您可以稍后将您的代码与他们的代码进行比较。)

    第一个变体将不可避免地从顺序工作项中读取或写入具有非顺序内存位置的矩阵元素。这意味着每次这样的访问都必须单独执行,并且由于全局内存访问有很大的延迟,它会减慢您的代码。

    第二个变体利用了称为合并的功能。显卡驱动程序可以将多个从顺序工作项到顺序内存位置的内存请求(有一些细微差别,请参阅编程指南了解详细信息)合并为一个大请求,并一次读取 8 个浮点数。因此,您只有一个,而不是 8 个长请求,这显着提高了性能。

    但是在矩阵乘法算法中,为了使您的全局内存访问顺序,您在一个工作项中处理的数据必须由另一个项存储。这就是为什么你必须使用本地内存——你填充它,同步工作组,然后将它的内容存储到全局内存——但是以不同的顺序,以便存储过程是连续的。是的,它涉及对本地内存的一些额外读取/写入,但这些的延迟要少得多,因此如果您合并足够多的全局内存操作,那么您总体上是赢家。

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2011-10-18
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多