2016-07-22 11 views
1

私は100要素の配列を持っています。これらの100要素を別の配列のn番目の要素にコピーします。OpenCL - 配列のn要素ごとに値を挿入する

はさんは言ってみましょうn個の値は、すべてのn番目の要素にコピーされた後に3

新しい配列が[... val1とval2の0 0 0 0 0 0 val3は]を持っているでしょうました。今openclでは、現在のインデックスを指すポインタを作成しようとしましたが、単にこの値にnを追加するだけです。ただし、現在のインデックスは常に同じ値を保持します。以下は私のコードです。

__kernel void ddc(__global float *inputArray, __global float *outputArray, __const int interpolateFactor, __global int *currentIndex){ 
    int i = get_global_id(0); 
    outputArray[currentIndex[0]] = inputArray[i]; 
    currentIndex[0] = currentIndex[0] + (interpolateFactor - 1); 
    printf("index %i \n", currentIndex[0]);  
} 

currentIndex部分のホストコード:

int *index; 
index = (int*)malloc(2*sizeof(int)); 
index[0] = 0; 

cl_mem currentIndex; 
currentIndex = clCreateBuffer(
    context, 
    CL_MEM_WRITE_ONLY, 
    2 * sizeof(int), 
    NULL, 
    &status); 
status = clEnqueueWriteBuffer(
    cmdQueue, 
    currentIndex, 
    CL_FALSE, 
    0, 
    2 * sizeof(int), 
    index, 
    0, 
    NULL, 
    NULL); 
printf("Index enqueueWriteBuffer status: %i \n", status); 
status |= clSetKernelArg(
    kernel, 
    4, 
    sizeof(cl_mem), 
    &currentIndex); 
printf("Kernel Arg currentIndex Factor status: %i \n", status); 

私は2つの要素を持つ配列を使用していますなぜあなたは不思議に思っているならば、私は1つだけを参照する方法がわからなかったので、それはです変数。私は入力と出力の配列を同じように実装しました。私は3のinterpolateFactorでカーネルを実行すると、私はあなたが何をしたいのか、右理解している場合、currentIndexは常に2

答えて

2

を印刷していることはそうcurrentIndexに使用されるべき次のインデックスを保存しています。これは動作しません。この値は、他の作業項目に対して即座に更新されることはありません。このようにすれば、すべてのカーネルを順番に実行する必要があります。あなたは何ができるか

は、あなたがそうでなければあなただけのそれを完全に捨てることができ0以外の場所から起動することができます仮定

__kernel void ddc(__global float *inputArray, __global float *outputArray, __const int interpolateFactor, int start){ 
    int i = get_global_id(0); 
    outputArray[start+i*(interpolateFactor-1)] = inputArray[i]; 
} 

です。

はそれがうまくいけば、このことができますあなたが

int start = 0; 
status |= clSetKernelArg(
    kernel, 
    3, // This should be 3 right? Might have been the problem to begin with. 
    sizeof(int), 
    &start); 

を行うことのように働いてもらうために。

+0

そのように簡単です。もう一度ありがとう、私はそれを試していないと信じることはできません。また、あなたは3について正しいです、私は質問のためにカーネルのために他の不要な引数を削除していて、その編集を逃していました。 –

関連する問題