我在FPGA和GPU中使用PyOpenCL运行内核。为了衡量执行所需的时间,我使用:
t1 = time()
event = mykernel(queue, (c_width, c_height), (block_size, block_size), d_c_buf, d_a_buf, d_b_buf, a_width, b_width)
event.wait()
t2 = time()
compute_time = t2-t1
compute_time_e = (event.profile.end-event.profile.start)*1e-9
这为我提供了从主机(compute_time)和设备(compute_time_e)的角度来看的执行时间。问题是这个值非常不同:
compute (host-timed) [s]: 0.0009386539459228516
compute (event-timed) [s]: 9.4528e-05
有谁知道造成这种差异的原因是什么?更重要的是,哪一个更准确?
谢谢。
答案 0 :(得分:1)
这些数字对我来说都是正确的。如果我正确读取它,主机测量的设备时间大约是设备时间的10倍 - 这对于小型内核来说并不是特别奇怪,因为它包含传输时间latency。您的主机时间测量通过PCB进行通信,但您的设备时间只是测量片上操作。
我认为你的节目时间错误如下:
Kernel Execution Time: 0.1ms // event-timed
Transfer Time: 0.8ms // (host-timed - event-timed)
Total Time: 0.9ms // host-timed
如果您对这种情况感到好奇,请尝试在设备上运行需要更长时间的内核。您应该开始看到这些数字更紧密地匹配,因为固定传输时间变得更少于总时间。
例如:
Kernel Execution Time: 900ms
Transfer Time: 0.8ms
Total Time: 900.8ms
答案 1 :(得分:0)
您可以在OpenCL的Intels网站上学到很多东西。它指出,event.profile
仅提示内核的纯硬件执行时间,而忽略了数据传输时间(首次测量中已包括在内)。因此,主机端挂钟时间可能会返回不同的结果。但是,也有声明说,如果将内核作为OpenCL设备作为CPU的目标,则时间差应该变小(甚至可以忽略不计)。