OpenCL程序的基准测试

时间:2014-10-28 16:23:44

标签: python-2.7 opencl benchmarking pyopencl

我一直在尝试使用PyOpenCL在GPU上对我的FFT程序进行基准测试。在使用“性能分析”时,我看到完全不同的结果。 OpenCL和'时间' python模块。要使用分析,我会这样做,

queue = cl.CommandQueue(ctx,properties=cl.command_queue_properties.PROFILING_ENABLE)
<other codes>
for i in range(N):
  events.append(prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>))
  events[i].wait()
for i in range(N):
  elapsed = elapsed + 1e-9*(event[i].profile.end - event[i].profile.start)
print elapsed

虽然可以像这样使用时间模块,

k=time.time()
for i in range(N):
  event = prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>)
print time.time()-k

由于这两个结果对于N = 20给出完全不同的结果,(虽然答案保持不变且正确!),我有以下问题。

  1. 事件分析究竟做了什么,是否增加了在event.wait()中花费的时间?
  2. 由于在案例2中没有event.wait()的答案是相同的,是否只是在执行内核时花费了适当的时间?
  3. 请告诉我在python中对OpenCL程序进行基准测试的正确方法。

1 个答案:

答案 0 :(得分:3)

你的第二种情况只是捕获将内核排入队列所需的时间,而不是实际运行它。一旦将内核调用放入队列中,这些排队内核调用就会返回 - 内核将与主机代码异步运行。要同时计算内核执行时间,只需添加一个等待所有入队命令完成的调用:

k=time.time()
for i in range(N):
  event = prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>)
queue.finish()
print time.time()-k

您的第一种情况是正确计时内核执行所花费的时间,但是在每次内核调用之间不必要地阻塞主机。所有命令入队后,您可以再次使用queue.finish()

for i in range(N):
  events.append(prg3.butterfly(queue,(len(twid),),None,twid_dev,<buffers>))
queue.finish()
for i in range(N):
  elapsed = elapsed + 1e-9*(event[i].profile.end - event[i].profile.start)
print elapsed

这两种方法都应该回归几乎相同的时间。