在OS X OpenCL CPU运行时中,文档here表示“工作项目安排在提交给Grand Central Dispatch的不同任务中”。这似乎表明工作组本质上是一个无操作,你应该拍摄(工作项数)=(硬件线程数)与(工作组数)无关。但是,在其他实现中,通过基本协程(setjmp和longjmp)在同一工作组中的项之间进行低成本切换,这将使安排更多工作项的成本更低(因为您避免使用完整的OS管理的线程)物品之间的上下文切换),这反过来会使CPU和GPU目标之间的代码重用更容易。根据“使用OpenCL进行异构计算”,AMD的CPU运行时就是这样做的,我隐约记得一些文档表明英特尔的CPU运行时也是如此。
任何人都可以确认OS X CPU运行时中工作组的行为吗?
答案 0 :(得分:3)
如文档后面所述(参见Autovectorizer部分),CPU上的工作组大小链接到自动向量化代码。
autovectorizer将几个连续的工作项聚合到一个内核函数中,尽可能地调用向量指令(SSE,AVX)。
将工作组大小设置为1会禁用自动向量化程序。较大的值将在可用时启用矢量代码。在大多数情况下,生成的代码能够有效地使用所有CPU资源。
在所有情况下,CPU上的OpenCL都在少量硬件线程上运行。
更新:回答评论中的问题。
通常效果很好。从“标量”内核开始并对其进行基准测试以查看自动向量器提供的加速,然后仅在加速不够好时才“手动向量化”。为了帮助编译器,避免使用“if”,并且更喜欢条件赋值和位操作。