0

3D 立方体で動作する補間ツールを作成しようとしていますが、どういうわけか値を正しく取得できません。これは、ある配列から別の配列に値を再割り当てする単純化されたカーネルです

__kernel void interpolate(__global float* input, __global float* output){
    output[0] = input[0];
    output[1] = input[1];
    output[2] = input[2];
    output[3] = input[3];
    output[4] = input[4];
}

出力配列を読み取って CPU コードに戻すと、入力配列に入れられた値が正確な順序で返されるはずです。上記の例が賢明なことを何もしていないことは知っていますが、私はその原理に興味があります。

私が得るべき出力は次のとおりです。

input0: 42.392487
input1: 20.455040
input2: 3.366035
input3: 20.000000
input4: 0.948683

しかし、私は得る:

output0: 42.392487
output1: 20.455040
output2: 20.000000
output3: 20.000000
output4: 20.000000

ここでどこが間違っているのかについてのヒントはありますか?

更新: (再度: 入力/出力宣言を追加し、CL_MEM_READ_ONLY を更新)

これは、メモリを作成し、データをデバイスにコピーし、カーネル引数を設定するコードです

float *input = malloc(sizeof(float)*counter);
float *output = malloc(sizeof(float)*counter);
input = clCreateBuffer(context,  CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,  sizeof(input), intput, NULL);
output = clCreateBuffer(context,  CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,  sizeof(output), output, NULL);
err  = clSetKernelArg(kernel, 0, sizeof(cl_mem), &input);
err  = clSetKernelArg(kernel, 1, sizeof(cl_mem), &output);
4

2 に答える 2

1

あなたの問題は、変数をポインター別名として宣言した場合:

cl_float *input = malloc(sizeof(cl_float)*counter);
cl_float *output = malloc(sizeof(cl_float)*counter);

それから

sizeof(input); // == 8 

配列のサイズではなく、浮動小数点ポインターのサイズを返します (この場合、64 ビット システムでは 8 が返されます)。

malloc と同じ引数を渡す代わりに、必要な配列のサイズを取得するには:

sizeof(cl_float) * counter; // == size your array

したがって、現在のステートメントでバッファを作成する必要があります。

input_buf = clCreateBuffer(context,  CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,  sizeof(cl_float) * counter, intput, NULL);
output_buf = clCreateBuffer(context,  CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,  sizeof(cl_float) * counter, output, NULL);
于 2015-01-08T14:30:40.920 に答える
0

上記の問題の解決策は、使用しないことでした

float *input = malloc(sizeof(float)*counter);

メモリを割り当てるのではなく、次のようにします。

float input[counter];

コードに変更すると、すべてが機能し始めました。これは私にとってはうまくいきますが、今はもっと複雑な問題があります。これは上記の問題とは関係がないため、別のスレッドにリストします。

助けてくれてありがとう。

于 2013-06-22T01:58:32.350 に答える