2013-07-01 34 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調用的開銷「。