0

我的 OpenCL 内核有问题。输入参数在传递给内核时已损坏。奇怪的是,这个完全相同的内核在 mac osx 上完美执行。一旦我开始将我的代码移植到 Windows(Windows 8 64 位),我就开始遇到这个问题。

我提供了一个使用我的相机结构的示例。x,y,z 坐标定义为 <0,0,200>。但是,当它们进入我的内核时,它们显示为 <0,-0.00132704, -0.00132704>。

我有一个接受两个结构的内核。

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 之前,我打印出局部变量以确保它们正确有效。

4

1 回答 1

2

看起来是对齐/包装问题。尝试在结构中使用 float4 而不是 float3,并在最后移动 float d。

于 2013-02-19T03:49:15.857 回答