我一直在尝试用PyOpenCL在GPU上测试我的FFT程序。在使用OpenCL的“分析”和python的“time”模块时,我看到了完全不同的结果。为了进行分析,我做了这样的事情,
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程序进行基准测试的正确方法。
发布于 2014-10-28 16:41:06
第二种情况只是捕获内核排队所需的时间,而不是实际运行它。这些队列内核调用一旦内核调用放在队列中就会返回--内核将与主机代码异步运行。要同时执行内核,只需添加一个调用,等待所有排队命令完成:
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这两种方法都应在几乎相同的时间内返回。
https://stackoverflow.com/questions/26613417
复制相似问题