Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 PyOpenCL程序的基准测试_Python 2.7_Opencl_Benchmarking_Pyopencl - Fatal编程技术网

Python 2.7 PyOpenCL程序的基准测试

Python 2.7 PyOpenCL程序的基准测试,python-2.7,opencl,benchmarking,pyopencl,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(q

我一直在尝试使用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
queue=cl.CommandQueue(ctx,properties=cl.command\u queue\u properties.PROFILING\u ENABLE)
对于范围(N)中的i:
append(prg3.butterfly(队列,(len(twid)),None,twid\u dev,)
事件[i]。等待()
对于范围(N)中的i:
已用=已用+1e-9*(事件[i].profile.end-事件[i].profile.start)
打印时间已过
虽然时间模块可以这样使用

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
k=time.time()
对于范围(N)中的i:
event=prg3.butterfly(队列,(len(twid)),无,twid\u dev,)
打印时间。时间()-k
由于这两种方法对N=20给出了完全不同的结果(而答案仍然相同且正确!),我有以下问题

  • 事件分析的具体作用是什么?它是否添加了在event.wait()中花费的时间
  • 既然在案例2中答案是相同的,没有event.wait(),那么仅仅执行内核所花费的时间是否合适

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

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

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

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

    谢谢,这很有意义。但是如果没有event.wait()或queue.finish(),我就能够得到正确的答案。所以,内核必须在这段时间内执行,并且输出已经准备好复制到主机。有任何意见吗?@KarthikHegde Yes-当您将数据复制回主机(例如,通过阻止读取操作)时,将强制完成以前提交的所有命令。