【问题标题】:Does OpenCL workgroup size matter in the OS X CPU runtime?OpenCL 工作组大小在 OS X CPU 运行时是否重要?
【发布时间】:2013-04-22 05:12:38
【问题描述】:

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

谁能确认 OS X CPU 运行时中工作组的行为?

【问题讨论】:

    标签: macos opencl grand-central-dispatch


    【解决方案1】:

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

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

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

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

    更新:回答 cmets 中的问题。

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

    【讨论】:

    • 这很有趣。我没有意识到这一点。它有多好?自己做不是更好吗?我的意思是使用 float8,例如,一次对 8 个像素进行操作并提交 n/8 个作业?然后你就确定它正在做你想做的事。
    • 我的意思是每个像素都没有一个内核,作业数 = num。像素取而代之的是一个内核,它一次对 8 个像素进行操作(使用浮点数 8)和 num_jobs = num_pixels/8。
    • 我看的越多,我就越认为文档不正确或具有误导性,并且它是工作组,而不是工作项,它们是并行度单元/向 GCD 发送的单元。自动矢量化文档指出它“将工作项打包在一起 [并] 在整个工作组上生成一个循环”,这表明项目一旦被工作分组就不再是不同的任务,这将更符合方式英特尔和 AMD CPU 运行时也可以运行。目前还不清楚禁用自动矢量化是否属实。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2015-06-28
    • 2017-04-12
    相关资源
    最近更新 更多