2013-07-10 12 views
6

私は、各サブ配列の合計がローカルキャッシュ配列に保存される複数の配列として配列を処理する必要があるOpenCLカーネルを持っています。例えばOpenCLカーネル内でローカルアレイの動的作成

、fowlingアレイを想像:

[[1, 2, 3, 4], [10, 30, 1, 23]] 
  • 各ワークグループは、(exempleに、我々は2作業基を有する)配列を得ます。
  • 各作業項目は2つの配列インデックスを処理します(たとえば、値インデックスにlocal_idを掛けます)。作業項目の結果は作業グループ共有配列に保存されます。

    __kernel void test(__global int **values, __global int *result, const int array_size){ 
        __local int cache[array_size]; 
    
        // initialise 
        if (get_local_id(0) == 0){ 
         for (int i = 0; i < array_size; i++) 
          cache[i] = 0; 
        } 
    
        barrier (CLK_LOCAL_MEM_FENCE); 
    
        if(get_global_id(0) < 4){ 
         for (int i = 0; i<2; i++) 
          cache[get_local_id(0)] += values[get_group_id(0)][i] * 
                     get_local_id(0); 
        } 
    
        barrier (CLK_LOCAL_MEM_FENCE); 
    
        if(get_local_id(0) == 0){ 
         for (int i = 0; i<array_size; i++) 
          result[get_group_id(0)] += cache[i]; 
        } 
    } 
    

問題は、私は、カーネルパラメータを使用して、キャッシュ配列のサイズを定義することはできませんということですが、私は、ダイナミックカーネルを持つためにする必要があります。

どうすれば動的に作成できますか?

または、唯一の解決策は、私のカーネル関数に一時配列を送ることですか?

+0

http://stackoverflow.com/questions/2541929/how-do-i-use-local-memory-in-opencl –

答えて

15

これは、カーネルパラメータとして__local配列を付加することによって達成することができる。

__kernel void test(__global int **values, __global int *result, 
    const int array_size, __local int * cache) 

とカーネルパラメータの所望のサイズ提供する:

clSetKernelArg(kernel, 3, array_size*sizeof(int), NULL); 

をローカルメモリは、カーネル起動時に割り当てられます。必要なローカルメモリサイズがデバイスの制限を超えないようにするには、余分なチェックが必要な場合があります。

関連する問題