2013-08-21 56 views
0

我想根據條件在opencl內核的輸出數組中輸入一些值。所以我想在每個輸入到數組中的值後增加數組的索引。由於需要滿足條件,所以輸出數組索引是未知的。我現在用的是輸出數組索引作爲參數:OpenCL - 陣列的內核增量索引

__kernel void match(__global float* input, __global float* output, int pos) 
{ 
    if(condition) 
    { 
      output[pos] = input[get_global_id(0)]; 
      atomic_inc(&pos); // this is where the problem lies 
    } 
} 

我也想給POS機作爲數組

__kernel void match(__global float* input, __global float* output, __global int* pos) 
{ 
    if(condition) 
    { 
      output[pos[0]] = input[get_global_id(0)]; 
      atomic_inc(pos[0]); // this is where the problem lies 
    } 
} 

的clBuildProgram與這兩種情況下的錯誤代碼-11返回。它工作時,我增加了值pos ++,但沒有返回任何數組的位置的最終值。

任何人都可以解釋我做錯了什麼?

回答

2

不知道我理解的問題,但讓我們給它一個鏡頭:

分配一個線程在input每個元素?如果是這樣,input將在內核中使用index[get_global_id(0)]假設(巨大的假設)您使用的是一維數組,並與全球工作尺寸類似於size_t Global_Work_Size[1] = {input_size}

當調用與int pos類似於第一個例子內核叫clEnqueuNDRangeKernel()進行索引,這在每個線程中放置一個常量pos,所以它不會工作,因爲我解釋你的問題。

如果內核索引不能以簡單的方式進行映射,則需要即時計算索引或者需要輸入另一個數組,該索引是映射到inputoutput的索引的查找表(LUT) 。

最後,您可以使用clGetProgramBuildInfo準確找出錯誤是什麼。 See the write-up I did in another thread

+0

對不起,不包括get_global_id(0)。但是,是的,我只想將這些輸入元素放入通過某種條件的輸出中。所以對於某個線程,如果條件通過,輸出數組會增加。這是一個需要轉換爲並行的順序問題嗎? – shunyo

+0

你也可以給我一個在飛行中計算位置的想法嗎?在順序版本中,當條件滿足時,我使用了vector和push_back()。 – shunyo

+0

嗨Shunyo, 對不起,延遲響應。最簡單的方法是使輸入和輸出數組的大小相同。如果條件滿足,則將該值放入輸出數組中,否則放置0(或-1)。除此之外,如果不知道算法,它確實很難。在OpenCL中實現的C++中沒有真正的動態向量。 – Austin

0

您不能直接使用您使用atomic_inc遞增的變量的值,否則將出現競爭條件。 atomic_inc的documentation提到它在增量之前返回舊值,並且如果每個線程以這種方式使用它,它們將分別得到一個唯一值。因此,要使用它的正確方法是:

int localPos = atomic_inc(&pos); 
output[localPos] = input[get_global_id(0)]; 

「POS」可以是全局或局部的,但現在看來似乎應該是全球對您的使用。