0

在 OS X OpenCL CPU 运行时,这里的文档表示“工作项目安排在提交给 Grand Central Dispatch 的不同任务中”。这似乎表明工作组本质上是无操作的,你应该为(​​工作项数)=(硬件线程数)而(工作组数)无关紧要。然而,在其他实现中,同一工作组中的项目之间通过本质上的协程(setjmp 和 longjmp)进行低成本切换,这将使安排更多工作项目的成本大大降低(因为您避免了完整的操作系统管理的线程项目之间的上下文切换),这反过来将更容易在 CPU 和 GPU 目标之间重用代码。根据“使用 OpenCL 进行异构计算”,AMD 的 CPU 运行时会这样做,我隐约记得一些文档表明英特尔也是如此。

任何人都可以确认 OS X CPU 运行时中工作组的行为吗?

4

1 回答 1

3

如文档后面所述(请参阅 Autovectorizer 部分),CPU 上的工作组大小与自动矢量化代码相关联。

自动向量化器将几个连续的工作项聚合到一个调用向量指令(SSE、AVX)的内核函数中。

将工作组大小设置为 1 会禁用自动矢量化器。较大的值将在可用时启用矢量代码。在大多数情况下,生成的代码能够有效地使用所有 CPU 资源。

在所有情况下,CPU 上的 OpenCL 在少量硬件线程上运行。

更新:回答评论中的问题。

它通常工作得很好。从“标量”​​内核开始并对其进行基准测试以查看自动矢量化器提供的加速,然后仅当加速不够好时才“手动矢量化”。为了帮助编译器,避免使用“if”,而更喜欢条件赋值和位操作。

于 2013-04-20T19:06:02.017 回答