hin*_*erk 1 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))
Run Code Online (Sandbox Code Playgroud)
输出:
OpenCL takes 1.223419 seconds
numpy takes 0.269451 seconds
Run Code Online (Sandbox Code Playgroud)
为什么我没有看到并行性的一些优点?我也很欣赏结构良好(py)?opencl 教程或文档的链接。提前致谢!
在一个极其廉价的操作上比较两者并不是一个很好的比较。
对于大多数设备,OpenCL 必须将所有数据移入和移出设备(例如,从主内存移至 GPU 内存,然后移回),当操作很简单时,其成本比操作本身还要高。它还必须编译/传输代码来执行操作,这具有非零成本、设备和主机之间的同步等。尝试找到真正要做的工作(理想情况下,没有条件分支的实际工作);在不与设备进行数据传输的情况下完成的实际工作越多,OpenCL 的效果就越好。请注意,numpy仍然会做得很好,因为它会在可用时使用向量化操作本身;SSE 操作可能无法像 GPGPU 代码那样进行扩展,但是当操作很简单并且您不需要与设备进行内存传输时,它numpy可以做得很好。
为了进行比较,您可以尝试检查数据传输本身花费的时间;假设pyopencl没有优化它,您可能只是尝试一个 noop 操作,将数据发送到设备,然后将其拉回,并查看数据传输产生了什么样的开销。从那里,您可以看到涉及哪些基本开销pyopencl;如果numpy没有做足够的工作来显着超过该开销,那么pyopencl将无济于事。
| 归档时间: |
|
| 查看次数: |
3277 次 |
| 最近记录: |