2013-07-01 35 views
1

我有一个pyopencl程序,可以进行长时间的计算(每次运行3-5小时)。我有几个内核在循环中一个接一个地开始。所以,我有这样的事情:测量和最小化OpenCL开销

prepare_kernels_and_data() 

for i in range(big_number): # in my case big_number is 400000 
    load_data_to_device(i) # ~0.0002s 
    run_kernel1(i)   # ~0.0086s 
    run_kernel2(i)   # ~0.00028s 
    store_data_from_device(i) # ~0.0002s 

我测量的时候,我得到了以下几点:

  1. 系统时间为4:30小时(由Linux的测量time命令)
  2. 纯OpenCL的基于事件的定时是3:30小时(负载+计算+商店)

我想知道:

  1. OpenCL程序的最小开销有多大?在我的情况下,它就像35%
  2. 我应该信任基于事件的时间吗?
  3. 启用分析是否会为整个程序执行时间增加一些重要时间?

我知道开销取决于程序,我知道python不如纯C或CPP快。但我相信,当我将所有重要的计算转移到OpenCL内核时,我可以减少不超过5-7%。如果我错了,请纠正我。

P.S. AMD OpenCL,AMD GPU

回答

1

你如何测量OCL时间?只使用类似:

my_event.profile.end - my_event.profile.start 

如果是这样的话,你也可以采取其他指标那样:

my_event.profile.start - my_event.profile.queued 

该指标衡量执行之前在运行在用户应用程序中花费以及时间因此开销。该指标在AMD programing guide的第4.4.1节中建议。
他们也给出了有关分析解释命令可以通过批量发送,并作为批量因此

命令报告类似的起始时间和相同的 结束时间警告。

如果我很好记得,NVIDIA的流命令。但无论如何,您可以使用它来减少开销。例如,而不是具有:

Cl_prog.kernel1(…).wait() 
Cl_prog.kernel2(…).wait() 

你可以这样做:

Event1 = Cl_prog.kernel1(…) 
Event2 = Cl_prog.kernel2(…) 
Event1.wait() 
Event2.wait() 

等。
但我离题了;现在具体回答你的问题,这里是来自我上面提到的(这是来自AMD,但我想它应该是相当多的NVIDIA相同)相同的部分采取了一些输入:

  1. “对于CPU的设备中,内核启动时间快(几十微秒的),但对于独立GPU设备也可以是几百微秒“

  2. 查看报价以上

  3. ”上的命令队列启用分析增加了约10微秒到40微秒所有clEnqueue调用的开销“。