处理OpenCL内核中的临时矩阵和私有内存

时间:2012-11-06 15:33:35

标签: image-processing matrix opencl signal-processing

我目前正在将一种相当苛刻的匹配追踪算法(这是更大的图像处理算法的一部分)迁移到OpenCL。

该算法使用一些内部矩阵和向量进行处理。其中一半的尺寸相当小(少于10列),但另一半可能会变得相当大,具体取决于输入矩阵(n * n,2n * n等)。

所有内部矩阵的定义取决于输入矩阵。

鉴于标准中没有本地分配功能,我通过将内存块从全局内存映射到工作项的私有内存来解决内存问题。我确保在上下文设置期间块不重叠,以便在运行时确保数据一致性。

这种方法对我来说不合适。感觉更像是黑客。

你们有没有遇到过这种情况?你的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

像这样分割全局内存缓冲区很好,虽然通常只用于输出回主机。全局内存访问通常需要花费数百个指令周期,因此我建议您:

  1. 在__private或__local内存中分配临时数据。检查后者的CL_DEVICE_LOCAL_MEM_SIZE,通常为16KB-64KB。请记住,多工作组上的__本地内存在工作组之间共享;如果使用太多,即使在CL_DEVICE_LOCAL_MEM_SIZE限制内,这也会对多处理器的占用率产生负面影响,从而影响吞吐量。观察这种情况的最佳方法是通过对工作负载+设备进行实验。

  2. 如果您的临时矩阵对于__本地内存而言太大,请考虑是否可以使每个工作项更小,以使其适合并避免全局内存的相当大的开销。

  3. 如果每个工作项的最小数据占用空间有一些硬约束,请按照您的描述使用__global内存。但请确保你:

    • 使用大量工作组启动内核,以便在有些人忙于等待全局内存访问时,可以在多处理器上安排其他工作组(“延迟隐藏”)。
    • 在供应商支持的情况下,合并全局内存访问。 NVidia OpenCL最佳实践指南详细介绍了一下,并且可以实现> 100%的性能提升。

答案 1 :(得分:1)

你的方法似乎没问题。

您可以查看NVidias OpenCL best practice guide。在第3.2.2节 - “共享存储器”中 - 有一个矩阵乘法的例子。每个工作组将所需数据从全局内存复制到本地内存中。