2013-02-19 1 views
0

OpenCL 커널에 문제가 있습니다. 입력 인수가 커널에 전달되면 입력 인수가 손상됩니다. 이상하게 만드는 이유는이 똑같은 커널이 mac osx에서 완벽하게 실행된다는 것입니다. 창 (Windows 8 64 비트)으로 코드를 포팅하기 시작한 후에이 문제가 발생하기 시작했습니다.OpenCL 손상 입력 WIN32, OSX Lion에서 유효

카메라 구조체를 사용하여 예제를 제공했습니다. 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"); 
} 

마지막으로 내 인수를 적절한 명령 줄 슬롯에 연결합니다. 제 출력물에는 슬롯 0을 사용하고 있습니다.

err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &cam_input); 

그 모든 것을 확인하는 것은 성공

..

if (err != CL_SUCCESS) { 
     throw std::runtime_error(CLERROR_FAILED_CMDARGS); 
    } 

나는 프로세스의 모든 단계에서의 OpenCL에서 오류 메시지가 수신되지 않는 경우. 아무도 이것에 빠지지 않았나요? 어떤 도움이라도 대단히 감사합니다.

사이드 노트 - 각 단계에서 로컬 변수를 인쇄하여 GPU로 전달하기 전에 올바른지 유효성을 확인합니다.

답변

2

정렬/패킹 문제가 있습니다. 구조체에서 float3 대신 float4를 사용하고 끝에 float d를 이동하십시오.

+0

나는 결코 그것을 보지 못했을 것입니다. 그것은 성공적으로 전송할 수있는 방법의 문제를 해결합니다. 그러나, 나는 여전히 float3을 사용하는이 거대한 커널을 가지고 있으며 ctr-h가 그것을 고칠 것이라고 생각하지 않습니다. 정렬 문제를 해결하고 여전히 float3을 사용할 수있는 방법에 대한 제안 사항은 무엇입니까? 어쨌든, 도와 주셔서 감사합니다. – Freddy

+2

나는 항상 호스트 측에서 문제가있는 float3을 발견했으며, cl_float3을 사용하는 경우에도 이상한 정렬 문제를 일으키는 경향이 있습니다. 요즘에는 어디서나 float4를 사용하고 커널에서 .xyz를 사용합니다. 메모리를 절약하기 위해 애 쓰지 않는다면, 그것은 struct alignment에 대한 표준과 싸우는 것보다 나은 해결책이라고 생각합니다. – Thomas

관련 문제