2013-01-17 53 views
0

我在使用OpenCL的算法中工作,我需要測量它在並行和順序版本中的執行時間。由於這個原因,我使用的是外部循環迭代兩個代碼並測量它們的時間,但我已經獲得:OpenCL,這是正常執行時間嗎?

順序:3.06 SEGS

並行:269個SEGS

說我的代碼使用水貨版本是:

t_start=clock();     /* Start measuring time */ 

for(i=0;i<=N; i++) // N is really big, around a million, but is the same for both versions 
{ 

fitness = 0; 

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, NULL, 0, NULL, NULL); 

ret = clEnqueueReadBuffer(command_queue, vdistance, CL_TRUE, 0, siz_mem_distance_code, distance_code, 0, NULL, NULL); 

ret = clEnqueueReadBuffer(command_queue, vsumatorio, CL_TRUE, 0,siz_mem_sumatorio, sumatorio, 0, NULL, NULL); 

fitness = (1/(*sumatorio)) + (*distance_code/12) + ((pow(*distance_code,2))/4) + ((pow(*distance_code,3))/6); 

} 

t_finish=clock();     /* End measuring time */ 

這段代碼之前,我已經創建/初始化所有我們需要運行使用的OpenCL(平臺,devide,背景,隊列,緩存,內核程序的事, ...),並在此代碼後,我釋放一切。 我已經檢查過,這個時間的增加是由於在每次迭代中讀入兩個變量(distance_code和sumatorio),但是我必須這樣做,因爲我必須獲得適應值,這是一個順序指令,只能在內核已完成,所以......你能幫我嗎?我究竟做錯了什麼?

我希望能夠正確解釋我自己,謝謝。

注:我只與CPU一起工作。

+0

'global_item_size'有多大? – matthias

+0

global_item_size = 64 – Fran

回答

1

啓動這麼多內核的開銷超過了僅對64個數據項進行並行循環的好處。您需要重新編寫問題,以便在大批量數據上啓動相對較少的內核。在這種情況下,如果OpenCL編譯器生成適當的向量化機器碼,您會看到相對於順序版本的改進。

此外,如果生成的代碼包含任何向量指令,則應該檢查AMD's CodeXL或英特爾的Offline Compiler

+0

非常感謝您的回答matthias!我正在使用英特爾的離線編譯器來檢查我的內核,但是使用矢量指令來生成矢量化代碼,不是嗎? – Fran

+0

那麼,在最好的情況下,編譯器將用SSE或AVX指令而不是普通的x86指令生成優化的SIMD代碼。看看這個來自英特爾的[文檔](http://software.intel.com/zh-cn/blogs/2011/09/26/autovectorization-in-intel-opencl-sdk-15)。 – matthias

相關問題