OpenCL如何获取最小线程并行粒度

zenny_chen 2013-08-14 11:37:32
由于OpenCL是为各类处理器设备而打造的开发标准的计算语言。因此跟CUDA不太一样的是,其对设备特征查询的项更上层,而没有提供一些更为底层的特征查询。比如,你用OpenCL的设备查询API只能获取最大work group size,但无法获取到最小线程并行粒度。
但是,由于最小线程并行粒度对于OpenCL应用领域最广的GPU而言确实是一个比较重要的参数。如果你的work group的work item的个数是最小线程并行粒度的倍数,那么你的OpenCL kernel程序往往会达到很高的计算效率,同时也能基于这个模型来做一些Memory Bank Confliction的避免措施。因此,我这里提供了一个比较简单的OpenCL kernel来获取当前GPU或其它处理器的最小线程并行粒度。

详细请见:
http://www.cnblogs.com/zenny-chen/p/3252061.html
...全文
517 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
outstander 2013-08-20
  • 打赏
  • 举报
回复
OpenCL上wavefront是最小的调度线程单位, AMD GPU平台的wavefront大小为64, Nvidia GPU则是32
zenny_chen 2013-08-15
  • 打赏
  • 举报
回复
感谢测试。 一般来说,CPU的最小并行粒度即为最大work group size。如果你获得的是1024,可以检查一下你的cl__device对象是否为GPU,把设备型号通过device query查询一下。 我机器上测得的结果是,APU上的CPU是1024,GPU是64,另外,还有一个独立GPU Radeon HD 74xxM的也是64。
XD王 2013-08-15
  • 打赏
  • 举报
回复
显卡型号: AMD Radeon HD 6630M The minimum granularity is : 1024
zenny_chen 2013-08-15
  • 打赏
  • 举报
回复
这个跟CPU的核心数或者SMT线程数没有直接关系。因为OpenCL将CPU的每一个核心(Core)算作为一个Compute Unit。而线程粒度是在Compute Unit中计算得到的。由于目前OpenCL是利用循环来遍历执行每个work item的代码的,所以它们的粒度基本上就是最大work group size了。
XD王 2013-08-15
  • 打赏
  • 举报
回复
大乌龙... context获取的时候用了“CL_DEVICE_TYPE_CPU”,而不是“CL_DEVICE_TYPE_GPU” 双核四线程CPU,用 clGetContextInfo 获取到的设备数量也是 4 啊,这个跟cpu有关系吗?

显卡型号: AMD Radeon HD 6630M
The minimum granularity is : 64

604

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧