【问题标题】:Translate OpenCl code for CPU compilation翻译 OpenCl 代码以进行 CPU 编译
【发布时间】:2021-09-11 15:38:33
【问题描述】:

有时我发现自己在编写 OpenCl 内核代码(使用 pyopencl),即使对于涉及中等计算复杂度的任务也是如此,因为它比一系列 numpy 操作更容易开发(尤其是在不存在适当的 numpy 函数的情况下)。

但是,在这些情况下,主机和设备之间的传输开销/延迟可能会超过计算所花费的时间。

我正在考虑创建一些 Python 工具,它会自动将 OpenCl 代码转换为例如Cython 代码(或类似代码),在为 CPU 编译后,可以直接在 numpy 数组的底层内存上工作,而无需将数据复制到设备。我知道 CPU 能够使用适当的驱动程序执行 OpenCl 内核。但是,由于to_device 操作,这仍然存在额外延迟的缺点。多核 CPU 还可以利用 OpenCL 编程模型进行并行执行。此外,这种方法无需特殊的 OpenCl 驱动程序,只需要一些用于 C 代码编译的构建工具。

这是一个合理的想法吗?我不想重新发明轮子。非常感谢任何可以实现我的目标的现有框架/工具的提示。

【问题讨论】:

    标签: numpy opencl cython pyopencl


    【解决方案1】:

    虽然将 OpenCL 代码转换为并行的面向 CPU 的代码可能是可能的,但很难(如果不可能的话)生成高效的代码。

    确实,OpenCL 鼓励/强制程序员执行大型计算步骤(内核),经常读取/写入相对较大部分的内存。但是,GPU 的内存带宽通常比 CPU 高得多(例如,我的 Nvidia 1660S 的带宽为 336 GB/s,而我的带有 2 个 DD4 通道的 i5-9600KF 在他们有价格相近)。无论对代码应用什么低级转换,OpenCL 计算内核都没有针对 CPU 进行完全优化。主要问题在于 OpenCL 算法本身以及编程模型。如果代码专门针对这样的平台进行了优化,将 OpenCL 内核重写为 CPU 代码通常可以提高执行效率。低级优化包括使用数据块在缓存中工作、使用寄存器阻塞、使用可用的最佳 SIMD 指令。高级优化包括为目标问题选择最佳算法和数据结构。 GPU 上最好的排序算法可能与 CPU 上最好的算法大不相同。这同样适用于其他问题,例如计算 前缀总和分区/中位数,甚至字符串搜索。因此,应该记住不同的硬件需要不同的计算方法/算法

    理论上,高级算法转换可以产生高效的代码,但即使可能,执行这种转换也非常复杂。确实,有fundamental theoretical limitations 强烈阻止了从halting problemhigh-level optimization 的许多通用高级代码分析/转换。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多