0

我有一个 AMD GPU,我想实现“矩阵转置”示例。想象一下实现的两个场景:

1)

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

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

2)

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

  • 写入本地内存

  • 从本地内存读取

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

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

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

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

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

先感谢您 :-)

4

1 回答 1

1

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

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

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

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

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

于 2013-07-30T02:23:41.917 回答