【发布时间】:2014-06-15 20:49:11
【问题描述】:
我正在寻找 Python 包装器到 OpenCL 和纯 C OpenCL 之间的性能测量。性能测量会随时间、内存等而变化。 - 有没有可用的基准? - 对时间性能差异的期望是什么? - 什么样的任务(当然是并行的......)应该有所作为?
【问题讨论】:
标签: c performance opencl performance-testing pyopencl
我正在寻找 Python 包装器到 OpenCL 和纯 C OpenCL 之间的性能测量。性能测量会随时间、内存等而变化。 - 有没有可用的基准? - 对时间性能差异的期望是什么? - 什么样的任务(当然是并行的......)应该有所作为?
【问题讨论】:
标签: c performance opencl performance-testing pyopencl
PyOpenCL 很可能是您的最佳选择。我会选择仅在非常特定的情况下使用 C(对 主机 上的速度/低延迟的超级关键需求)。对于大多数随意的并行程序,主机端有足够的空闲时间是可以的,因为所有真正的工作都是在设备上完成的。
您可以认为 PyOpenCL 和 OpenCL 在设备上具有相同的性能。
如果你是这样的话,也许可以使用 C,比如... 设计一辆自动驾驶汽车,每毫秒/安培都很重要。但即使在那种情况下,Python 也很有可能被有效地使用。
确定您的特定程序是否变慢的最佳方法是对您的代码进行计时。对于 PyOpenCL,这意味着:
import time
和
cl.command_queue_properties.PROFILING_ENABLE
许多聪明的公司和个人选择首先使用 Python 进行编码,因为他们可以快速构建灵活、可工作的原型。如果他们以后最终需要更多 host 性能,则将 Python 移植到 C 相对容易。
希望有帮助!
【讨论】:
OpenCL 使用预编译的程序,然后将其发送到设备执行。它们是所谓的“内核”。这些内核被部署为在终端设备上执行。这意味着必须衡量的主要成本是 OpenCL 实现 API I/O。因此,您不能依赖内存/CPU 测量,因为真正的 OpenCL 部分会使用它们。
AFAIK,没有可用的基准,但如果你需要它并不难做到(矩阵乘法是你好世界的例子,总体而言)。
OpenCL 不是那种,它在每个 CPU 周期都使用 I/O。使用领域——真正的大数据处理,即使用一个大输入、大量处理操作和一个输出(无论大小)。没有人说 OpenCL 不能用于大量 I/O 和最小计算变化,但实现 API 开销不值得。
期望 I/O 的速度与整体应用程序性能相当。
【讨论】:
这里有一个基准:https://github.com/bennylp/saxpy-benchmark,比较 PyOpenCL 与 OpenCL 以及其他框架/方法,例如 CUDA、纯 C++、Numpy、R、Octave 甚至 TensorFlow(免责声明:我是作者)
根据基准测试结果,OpenCL 和 PyOpenCL 之间的性能差异变化太大。 PyOpenCL GPU 目标几乎比 OpenCL 慢 7 倍,但对于 CPU 目标,PyOpenCL 实际上比 OpenCL 快 2 倍以上!
【讨论】: