【发布时间】:2016-07-11 20:56:16
【问题描述】:
如果这个问题很愚蠢,请原谅我的天真,我是 GPGPU 编程的新手。
我的问题是,由于设备的体系结构不能改变,当用户选择工作组大小时,如何优化 __local 内存以供仅本地工作组中的项目访问(取决于可分性)?
【问题讨论】:
如果这个问题很愚蠢,请原谅我的天真,我是 GPGPU 编程的新手。
我的问题是,由于设备的体系结构不能改变,当用户选择工作组大小时,如何优化 __local 内存以供仅本地工作组中的项目访问(取决于可分性)?
【问题讨论】:
本地内存通常连接到 GPU 硬件中的某个执行单元集群。工作组的大小确实是由客户端应用程序选择的,但是 OpenCL 实现会施加限制。您的应用程序需要通过 clGetKernelWorkGroupInfo() 使用 CL_KERNEL_WORK_GROUP_SIZE 参数名称来查询。
工作组规模具有一定的灵活性,因为大多数 GPU 都设计为可以安排多个执行线程在单个执行单元上运行。 (SMT 的一种形式。)还要注意,调度的线程甚至不需要在同一个工作组中,所以如果一个 GPU 在一个集群中有 64 个处理器,并且在每个处理器上支持 4 路 SMT ,这 256 个线程可能来自 1、2 或 4 个,甚至可能来自 8 或 16 个工作组,具体取决于硬件和编译器功能。
一些 GPU 的处理器也在内部使用向量寄存器和指令,因此线程不会 1:1 映射到 OpenCL 工作项 - 例如,一个处理器可能一次处理 4 个工作项。
但最终,工作组必须适合连接到一块本地内存的处理器集群;所以你有本地内存大小和可以在一个集群上调度的最大线程数,这会影响最大工作组大小。
一般来说,尽量减少您的工作组使用的本地内存量,以便 OpenCL 实现在调度工作组时具有最大的灵活性。 (但是当它有助于提高性能时,一定要使用本地内存!尽可能少地使用它。)
【讨论】: