OpenCLカーネルに問題があります。入力引数は、カーネルに渡されるときに破損しています。これを奇妙にしているのは、これとまったく同じカーネルがmacosxで問題なく実行されることです。コードをWindows(Windows 8 64ビット)に移植し始めると、この問題が発生し始めました。
カメラ構造体を使用した例を示しました。x、y、z座標は<0,0,200>として定義されます。ただし、カーネルに到達すると、<0、-0.00132704、-0.00132704>と表示されます。
2つの構造体を受け入れるカーネルがあります。
typedef struct{
cl_float d;
cl_float3 eye;
cl_float3 lookat;
cl_float3 u;
cl_float3 v;
cl_float3 w;
cl_float3 up;
}rt_cl_camera;
typedef struct {
float r;
float g;
float b;
} rt_cl_rgb;
テストのためにカーネルをスリム化しました。問題を追跡した後、入力パラメーターが正しく表示されていないことに気付きました。ただし、出力は正しく返されていると判断しました。
__kernel void ray_trace_scene( __global rt_cl_rgb* output,
__global rt_cl_camera* camera,
const unsigned int pcount)
{
int pixel = get_global_id(0);
if(pixel < pcount){
output[pixel].r = camera->eye.x;
output[pixel].g = camera->eye.y;
output[pixel].b = camera->eye.z;
}// End Pixel computation
}//End kernel
私は次のように入力バッファを作成しています:
cl_mem cam_input;
cl_uint cam_error;
cam_input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(rt_cl_camera), NULL, &cam_error);
また、バッファが正常に作成されたことを確認しています。
if (cam_error != CL_SUCCESS || !cam_input) {
throw std::runtime_error(CLERROR_FAILED_DEVBUFF);
}
次に、次のようにデータをバッファに書き込みます。
cl_uint err = 0;
err = clEnqueueWriteBuffer(commands, cam_input, CL_TRUE, 0, sizeof(rt_cl_camera), cam_ptr, 0, NULL, NULL);
if (err != CL_SUCCESS) {
throw std::runtime_error("Failed to write camera");
}
そして最後に、適切なコマンドラインスロットの引数をリンクします。スロットゼロが私の出力に使用されていることに注意してください。
err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &cam_input);
そして、すべてが成功したことを確認します。
if (err != CL_SUCCESS) {
throw std::runtime_error(CLERROR_FAILED_CMDARGS);
}
プロセスのどのステップでも、openCLからエラーメッセージを受信していません。誰かがこれに遭遇しましたか?どんな助けでも大歓迎です。
補足-ローカル変数を出力する各ステップで、GPUに渡す前に、ローカル変数が正しく有効であることを確認します。