我有一个pyopencl程序进行长时间计算(每次运行约3-5小时)。我有几个内核在循环中逐个启动。所以我有这样的事情:
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
我测量了时间,我得到了以下信息:
time
命令测量)我想知道:
我知道开销取决于程序,我知道python没有纯C或CPP那么快。但我相信,当我将所有繁重的计算移动到OpenCL内核时,我可以放松不超过5-7%。如果我错了,请纠正我。
P.S。 AMD OpenCL,AMD GPU
答案 0 :(得分:1)
您如何衡量OCL时间?仅使用以下内容:
my_event.profile.end - my_event.profile.start
如果是这种情况,您还可以采取其他指标:
my_event.profile.start - my_event.profile.queued
此度量标准衡量在执行之前在用户应用程序和运行时中花费的时间,从而计算开销。此指标在第4.4.1节AMD programing guide中建议 他们还提供有关分析的警告,说明命令可以批量发送,因此
作为批处理提交的命令报告类似的开始时间和相同 结束时间。
如果我记得,NVIDIA会传输命令。但无论如何,您可以使用它来减少开销。例如,而不是:
Cl_prog.kernel1(…).wait()
Cl_prog.kernel2(…).wait()
您可以执行以下操作:
Event1 = Cl_prog.kernel1(…)
Event2 = Cl_prog.kernel2(…)
Event1.wait()
Event2.wait()
等等。
但我离题了;现在回答你的问题,这里有一些来自我上面提到的同一部分的输入(它来自AMD,但我想它应该与NVIDIA几乎相同):
“对于CPU设备,内核启动时间很快(几十μs),但对于离散GPU设备,它可以是几百μs”
见上面的引用