2017-02-23 5 views
0

私は、次のパラメータ受け入れカーネルがあります。OpenClカーネルのインデックスをオフセットする方法はありますか?

1)グローバルIDはローカルIDは16以下

は、私が使用しているカーネルではないですが、私はそれを使用しています)

2 1040です私が実装したいものを示しています。基本的にAとBの配列入力は1040 * 10です。

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, int Offset, int constant) { 

    // Index of the current element to be processed 
    int i = get_global_id(0); 


    // Do the operation 
    C[i + Offset*constant] = A[i + Offset*constant] + B[i + Offset*constant]; 
} 

定数が一定であるのに対し、私は、...、値0,1を含む、ある種の「アレイ」とオフセット9たい。私はすでに配列としてこれらの値を渡してみましたが、この方法でオフセットを使用する配列を持つことはできないと思います(プログラムがクラッシュする)。私が書きたいもののサンプルは以下の通りです:

__kernel void vector_add(__global const int *A, __global const int *B, __global int *C, __constant const int *Offset, int constant) { 

    // Index of the current element to be processed 
    int i = get_global_id(0); 

    for (int k = 0; k < 10; k++) { 
    // Do the operation 
    C[i + Offset[k]*constant] = A[i + Offset[k]*constant] + B[i + Offset[k]*constant]; 
    } 
} 

ご注意:グローバルIDをスケーリング私のカーネルでは、それが固定されたままする必要があるため、オプションではありません。したがって、これを達成するためにとにかくありますか?

EDIT:私が実装したいものの例を追加しました。現在、このように動作しません。これは合法ですか?私が得た

+0

配列要素が0の場合はクラッシュしないでください。クラッシュしないと、バッファの範囲外です。 –

+0

@huseyintugrulbuyukisik私の質問を編集しました。私が投稿した2番目のカーネルは動作しません...これは合法だと言えば、ホストコードに問題があります – user1816546

答えて

1

エラーメッセージconstantが予約語であるため、

パラメータは、名前のアドレス空間

に割り当てることができないです。

Iこれのように、それの最後に '1' を加算することにより、変数名を変更しようとした:

__kernel void vector_add(__global int *A,  __global int *B, __global int *C, 
         __constant int *Offset,__constant int * constant1) { 

    int i = get_global_id(0); 
    int constVar=constant1[0]; 
    for (int k = 0; k < 10; k++) { 
     C[i + Offset[k]*constVar] = A[i + Offset[k]*constVar] + B[i + Offset[k]*constVar]; 
    } 
} 

、それがグローバル= 1040の動作、= 1040 * 10 ABC_size、16 = localは、からオフセット0〜9の配列とconstant1 = 1040

+0

確認のために感謝しますが、私のカーネルで動かすことができません...私は二重チェックします私のホストコード – user1816546

+0

は再びクラッシュしますか? –

関連する問題