OpenCL损坏输入WIN32,在OSX Lion上有效

时间:2013-02-19 02:57:12

标签: opencl

我的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。

1 个答案:

答案 0 :(得分:2)

查找对齐/打包问题。尝试在struct中使用float4而不是float3,并在末尾移动float d。