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