2013-12-18 44 views
2

我在理解OpenCL 2D工作組維度時遇到問題。OpenCL 2D工作組維度

我想創建一個N×N矩陣,並將每行賦予一組工作組進行計算。 例如,如果我有一個1000×1000的矩陣,我想每行有10個工作組(每個工作組計算100個元素)和10000個工作組(總共10×1000)。

這一塊我的代碼:

size_t global_pattern[] = {n,n,0}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern 

而且下面幾行:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, 
          group_pattern, 0, NULL, NULL); 

哪些失敗。錯誤代碼是-54,它引用#define CL_INVALID_WORK_GROUP_SIZE -54。

我的group_pattern數組初始化是否正確?我的意思是,數組的第一個元素是指x座標,第二個是我假設的y座標? 背後的數學是什麼?

爲了調試的目的,我還試着用一個空內核運行它(只是爲了確保它不是我的代碼問題)。我也嘗試交換group_pattern數組中的第一個和第二個元素。

+0

「哪個失敗」。那麼,什麼「失敗」? SEG_FAULTS是否會導致錯誤,在這種情況下,哪一個? – DarkZeros

+0

err!= CL_SUCCESS,這是預期值。如果我嘗試將它作爲一維問題發揮作用。我不確定用我的代碼實現了我用我的問題描述的預期語義。有沒有更具體的錯誤信息的方法?錯誤值是-54,如果它可以幫助。 – Kami

+0

如果錯誤不成功,那麼是錯誤是的,但有64種類型的錯誤代碼... – DarkZeros

回答

4

當你說:

size_t global_pattern[] = {n,n,0}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern 

,然後用它喜歡:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, group_pattern, 0, NULL, NULL); 

這顯然是錯誤的。你必須傳遞給內核的是local_size AKA,它是一個組的大小。不是你想如何分割你的空間。

因此,這將是這樣爲你的情況:

size_t global_size[] = {n,n}; //My matrix pattern 
size_t group_pattern[] = {workgroups_per_row, n}; //My workgroups pattern 
size_t local_size[] = {global_size[0]/group_pattern[0], global_size[1]/group_pattern[1]}; //My workgroups pattern 

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, local_size, 0, NULL, NULL); 

編輯:如果你有一個CL_INVALID_WORK_GROUP_SIZE,那麼原因可能是:

  1. 您指定一個本地的大小是不是全局大小的整數除數
  2. 設備不支持與您定義的一樣大的本地大小
+0

這是-54我編輯了我的問題。 – Kami

+0

我更新了可能的原因CL_INVALID_WORK_GROUP_SIZE(-54) – DarkZeros

+0

它的工作。謝謝。我剛剛弄錯了第六個參數的語義。 – Kami