2013-07-30 84 views
0

我有一个AMD GPU,我想实现'矩阵转置'的例子。想象一下,两个方案的实施:OpenCL - 本地内存效率

1)从全局内存(当前位置)

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

  • 2)阅读

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

      • 写入本地内存

      • 阅读从本地存储器

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

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

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

      我可以看到,在第一个中我们有1个读取和1个写入和到全局内存,在第二个,除了全局内存操作,我们有1个读取和1个写入和到本地记忆,它怎么会更快?

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

      预先感谢您:-)

    回答

    1

    我有一个AMD GPU和我想要实现“矩阵转置”的例子。

    (以防万一你不知道,NVIDIA SDK包含OpenCL的矩阵乘法例子(或许AMD APP也有一个),这样你就可以在以后你的代码与他们进行比较。)

    第一个变种将不可避免地从连续的工作项中读取或写入具有非顺序存储器位置的矩阵元素。这意味着每个这样的访问都必须单独执行,并且由于全局内存访问具有严重的延迟,所以会减慢代码的速度。

    第二个变体利用称为合并的特征。视频卡驱动程序可以将多个内存请求从顺序工作项目连接到顺序存储器位置(有一些细微差别,详情请参阅编程指南)并写入一个大请求,并且一次读取8个浮动内容。所以,而不是8个长的请求,你只有一个,这会显着提高性能。

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