我爲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();
您能否提供啓動/測量的一些代碼?自5ms以來,這是一個非常高的價值。舉個例子,在我的設置中,我有1us的執行開銷。 – DarkZeros
我添加一個例子。我衡量內核執行和參數設置。對於我的空內核,我只有1個參數和幾個編譯選項來讓內核接近我的差異。但我的設置是有點窮我認爲(CPU 4核心@ 1GHz和GPU 4核心在4 CU @ 500MHz)沒有本地內存 – baptiste