在OS X中央调度处理器运行时,documentation here指出“工作项被安排在提交给OpenCL的不同任务中”。这似乎表明工作组本质上是无操作的,您应该争取(工作项的数量)=(硬件线程的数量),而(工作组的数量)是不相关的。然而,在其他实现中,通过本质上的协程(setjmp和longjmp)在同一工作组中的项目之间进行低成本切换,这将使调度更多工作项目的成本更低(因为您避免了项目之间完全由操作系统管理的线程上下文切换),这反过来将使在CPU和GPU目标之间重用代码变得更容易。根据“使用OpenCL的异构计算”,AMD运行时做到了这一点,我依稀记得一些文档表明英特尔的CPU运行时也是如此。
任何人都能确认工作组在OS X CPU运行时的行为吗?
发布于 2013-04-21 03:06:02
正如本文后面所述(参见Autovectorizer一节),CPU上的工作组大小与自动矢量化代码相关联。
自动向量化器尽可能地将几个连续的工作项聚合到调用向量指令(SSE,AVX)的单个内核函数中。
将工作组大小设置为1将禁用自动矢量化。较大的值将在可用时启用矢量代码。在大多数情况下,生成的代码能够有效地使用所有CPU资源。
在所有情况下,CPU上的OpenCL都运行在少量的硬件线程上。
更新:回答评论中的问题。
它通常工作得很好。从“标量”内核开始,并对其进行基准测试,以查看自动向量化器提供的加速比,然后只有在加速比不够好的情况下才进行“手动向量化”。为了帮助编译器,避免使用"if",并且优先使用条件赋值和位操作。
https://stackoverflow.com/questions/16123912
复制相似问题