我的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。
答案 0 :(得分:2)
查找对齐/打包问题。尝试在struct中使用float4而不是float3,并在末尾移动float d。