我一直在尝试使用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给出完全不同的结果,(虽然答案保持不变且正确!),我有以下问题。
请告诉我在python中对OpenCL程序进行基准测试的正确方法。
答案 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
这两种方法都应该回归几乎相同的时间。