我已阅读文档和书籍 (也是这些帖子:OpenCL: query number of processing elements; Understanding work-items and work-groups; OpenCL: Work items, Processing elements, NDRange) 关于NDrange数据分区的执行模型和理论。
我是否根据硬件构建工作项和工作组?如果是,我如何查询设备上可用的工作项和工作组数量?如何划分工作项和工作组以实现良好的绩效是否有良好的做法?
我想知道它们如何在实践中工作和互动,用于计算一维数组和二维数组,如图像。
答案 0 :(得分:1)
良好的分区需要了解您的GPU硬件。例如,让我们看一下像Radeon 6970这样的AMD显卡。核心总数为1536.它们采用24个SIMD单元包装。每个单元由16个具有VLIW4架构的流处理器组成。因此,我们有16 * 4(因为VLIW4)* 24 = 1536核心。每个SIMD单元共享其中所有核心的一些资源(缓存等)。因此,对于Radeon 6970,本地组的大小是64的某个倍数。您可以在OpenCL设备中查询计算单元的数量。在我们的例子中,你应该得到24.因此,对于Radeon 6970计算单元上的OpenCL = SIMD单元。请注意,手动分区可能会导致具有不同体系结构的设备性能下降。
可以在Nvidia developer zone找到本地团体福利的一个很好的例子。看一下bitonic排序示例代码,它将向您展示如何使用本地组。