首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyOpenCL程序的台架标记

PyOpenCL程序的台架标记
EN

Stack Overflow用户
提问于 2014-10-28 16:23:43
回答 1查看 529关注 0票数 1

我一直在尝试用PyOpenCL在GPU上测试我的FFT程序。在使用OpenCL的“分析”和python的“time”模块时,我看到了完全不同的结果。为了进行分析,我做了这样的事情,

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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()的答案是一样的,那么仅仅执行内核所花费的时间合适吗?

请告诉我在python中对OpenCL程序进行基准测试的正确方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 16:41:06

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

代码语言:javascript
复制
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()

代码语言:javascript
复制
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

这两种方法都应在几乎相同的时间内返回。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26613417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档