OpenCL-本地内存效率

OpenCL-本地内存效率,opencl,Opencl,我有一个AMD的GPU,我想实现'矩阵转置'的例子。设想两种实现方案: (一) 从全局内存读取(当前位置) 写入全局内存(目标位置) (二) 从全局存储器读取(当前位置) 写入本地存储器 从本地存储器读取 写入全局内存(目标位置) 假设我为这两种解决方案选择了最佳的工作组规模。 顺便说一下,第二种算法利用了对本地内存的协作写入 最后,令人惊讶的是,第二个场景的速度是第一个场景的两倍。我就是不明白为什么 我可以看到,在第一个例子中,我们有一个从全局内存读取和写入的过程,在第二个例子中,除了

我有一个AMD的GPU,我想实现'矩阵转置'的例子。设想两种实现方案:

(一)

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

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

(二)

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

  • 写入本地存储器

  • 从本地存储器读取

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

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

最后,令人惊讶的是,第二个场景的速度是第一个场景的两倍。我就是不明白为什么

我可以看到,在第一个例子中,我们有一个从全局内存读取和写入的过程,在第二个例子中,除了全局内存操作之外,我们还有一个从本地内存读取和写入的过程,它怎么能更快呢

如果有人在这件事上帮助我,我会很高兴的

提前感谢:-)

我有一个AMD的GPU,我想实现'矩阵转置'的例子

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

第一种变体将不可避免地从顺序工作项读取或写入具有非顺序内存位置的矩阵元素。这意味着每一次这样的访问都必须单独执行,而且由于全局内存访问具有显著的延迟,因此会降低代码的速度

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

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