2013-12-13 33 views
1

我爲OpenCL構建了飛思卡爾i.MX6.Q平臺,並且獲得了有關它的有趣結果,我無法完全解釋。我的算法是通過執行4個內核完成的,最後一個是我在這裏感興趣的一個:經典的圖像差異。OpenCL並行化成本

我測試了兩個版本,一個矢量化版本和一個經典版本(沒有矢量化)。起初,我對一個並行化差異給出的結果感到驚訝:在這個平臺上,必須選擇OpenCL,只有要處理的圖像包含超過180kpix(在算法中,圖像被處理爲緩衝區)。

但是,對於這兩種OpenCL實現來說,開始時都有常量執行時間(大約5ms)(對於小圖像)。我檢查了一個空內核的執行時間,對於任何測試的圖像(從32x32到1920x1024),它們總是在該平臺上大約5ms。

我將這些時間看作一個空內核,作爲OpenCL差異的並行化成本,我想知道該成本包含哪些內容?

我的內核編譯在板凳外完成,我不知道哪個步驟需要5ms。它只是GPU正在處理的NDRange解釋嗎?

如果有人對此有解釋,我就拿!

巴蒂斯特

編輯:

我的時間測量和內核啓動:

start_time = time_now(); 

cl_mem_flags mem_device_host; 
if (device.getInfo<CL_DEVICE_HOST_UNIFIED_MEMORY>()==CL_TRUE) 
    mem_device_host = CL_MEM_USE_HOST_PTR; 
else 
    mem_device_host = CL_MEM_COPY_HOST_PTR; 

cl_status = kernel.setArg(0, input_image); 
oclReturnOnError(cl_status, "Passage de l'argument 0 du kernel 'morph'") 

cl_status = kernel.setArg(1, output_image); 
oclReturnOnError(cl_status, "Passage de l'argument 1 du kernel 'morph'") 

cl_status = kernel.setArg(2, input_SE); 
oclReturnOnError(cl_status, "Passage de l'argument 2 du kernel 'morph'") 

cl::Event eventMorph; 
cl_status = commandQueue.enqueueNDRangeKernel(kernel, 
    cl::NullRange, 
    global_range, 
    local_range 
    NULL , &eventMorph); 
oclReturnOnError(cl_status, "Ajout du kernel 'morph' à la queue de commande") 

cl_status = eventMorph.wait(); 
oclReturnOnError(cl_status, "Attende d'exécution du kernel 'morph'") 

end_time = time_now(); 
+0

您能否提供啓動/測量的一些代碼?自5ms以來,這是一個非常高的價值。舉個例子,在我的設置中,我有1us的執行開銷。 – DarkZeros

+0

我添加一個例子。我衡量內核執行和參數設置。對於我的空內核,我只有1個參數和幾個編譯選項來讓內核接近我的差異。但我的設置是有點窮我認爲(CPU 4核心@ 1GHz和GPU 4核心在4 CU @ 500MHz)沒有本地內存 – baptiste

回答

1

您的問題主要是你如何meassuring您的內核執行。使用操作系統time_now()會給你很差的分辨率,而不是測試OpenCL性能的方式。

此外,主機很慢參與GPU工作負載。所以,如果你排隊,不要強制執行(用clFlush()),然後被動地等待完成,結果是一個很差的感知性能。由於您必須等待所有的隊列並提交,所以您會在通話和真實執行之間看到很多開銷。

run + wait模型適用於示例和演示,但不應用於真實系統或性能測量。

衡量表現的正確方法正在使用event。您可以使用cl::Event.getProfilingInfo<CL_PROFILING_COMMAND_START>()cl::Event.getProfilingInfo<CL_PROFILING_COMMAND_END>()來衡量內核的開始和結束時間。

正確的方式運行系統,只是當您需要提取數據(通常在EnqueueReadBuffer())時,強制阻塞呼叫。這樣,如果你排隊一系列內核,它們將會一個接一個地運行,而且它們之間幾乎沒有空閒時間。

+0

是的,我知道這種方式來衡量GPU時間執行與事件。但不是一個問題,如果我沒有相同的時間測量引用(我比較C實現與OpenCL之一)?無論如何,我會試試看看它們之間的差異。 – baptiste