gpt4 book ai didi

image-processing - 处理 OpenCL 内核中的临时矩阵和私有(private)内存

转载 作者:行者123 更新时间:2023-12-04 07:24:06 24 4
gpt4 key购买 nike

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

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

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

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

我觉得这种方法不对。感觉更像是黑客攻击。

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

最佳答案

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

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

  2. 如果您的临时矩阵对于 __local 内存来说太大了,请考虑您是否可以让每个工作项更小,以便它确实适合并避免全局内存的大量开销。

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

    • 启动具有大量工作组的内核,这样当一些工作组忙于等待全局内存访问时,其他工作组可以在多处理器上进行调度(“延迟隐藏”)。
    • 在您的供应商支持的范围内合并全局内存访问。 NVidia OpenCL 最佳实践指南进行了一些详细介绍,>100% 的性能改进是非常容易实现的。

关于image-processing - 处理 OpenCL 内核中的临时矩阵和私有(private)内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13257449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com