numpy比OpenCL跑得快吗?

时间:2016-06-06 15:39:02

标签: python numpy pyopencl

我在pyopencl中尝试了一些基本的例子,并注意到,无论我做什么,numpy运行速度都比pyopengl快。我在Intel i5嵌入式HD4400上运行我的脚本。显然没什么特别的,但numpy的运行速度至少是pyopengl的两倍。我尝试的最后一个脚本:

import pyopencl as cl
from pyopencl import algorithm
import numpy as np
from time import time
from pyopencl.clrandom import rand
from pyopencl.array import to_device

if __name__ == '__main__':
    ctx = cl.create_some_context()
    queue = cl.CommandQueue(ctx)
    q = np.random.random_integers(-10**6,high=10**6, size=2**24)
    r = to_device(queue, q)
    begin = time()
    out, count, even = algorithm.copy_if(r, "ary[i] < 42", queue=queue)
    out.get()
    print("OpenCL takes {:9.6F} seconds".format(time() - begin))
    begin = time()
    b = q[q<42]
    print("numpy takes {:9.6F} seconds".format(time() - begin))

输出:

OpenCL takes  1.223419 seconds
numpy takes  0.269451 seconds

为什么我没有看到并行性方面的一些优势?另外,我很欣赏链接到良好结构化(py)?opencl教程或文档。提前谢谢!

2 个答案:

答案 0 :(得分:3)

比较两者在单一,极其便宜的操作上并不是一个很好的比较。

对于大多数设备,OpenCL必须将所有数据移入和移出设备(例如,从主存储器移动到GPU存储器,然后返回),当操作微不足道时,其成本高于操作本身。它还必须编译/传输代码以执行操作,其具有非零成本,在设备和主机之间同步等。尝试找到要做的实际工作(理想情况下,没有条件分支的实际工作);如果没有数据传输到设备和从设备传输更多的实际工作,OpenCL将会做得更好。请注意,numpy仍然会做得很好,因为它会在可用时自行使用矢量化操作; SSE操作可能无法按照GPGPU代码的方式进行扩展,但是当操作很简单并且您不需要与设备进行内存传输时,numpy可以做得很好。

为了进行比较,您可以尝试检查数据传输本身需要多长时间;假设pyopencl没有优化它,您可能只是尝试将数据发送到设备的noop操作,然后将其拉回,并查看数据传输产生的开销类型。从那里,您可以看到pyopencl涉及哪种基本开销;如果numpy没有做足够的工作来显着超过开销,那么pyopencl将无法提供帮助。

答案 1 :(得分:0)

如果您确实在嵌入式芯片上运行,则传输开销不应太大。但也请注意,这个微不足道的操作是内存限制的; numpy和opencl代码都是从同一个内存系统中获取的;所以你不应该期望在这个基准测试中获得任何东西。但是使用opencl会强制你在内存上再进行两次传递,以复制进出(in-ram)opencl上下文。然而,opencl显然还有额外的开销,我无法真正解释;也许没人会为这个芯片组制造半途而已的开放式驱动程序?

相关问题