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로 전달하기 전에 올바른지 유효성을 확인합니다.
나는 결코 그것을 보지 못했을 것입니다. 그것은 성공적으로 전송할 수있는 방법의 문제를 해결합니다. 그러나, 나는 여전히 float3을 사용하는이 거대한 커널을 가지고 있으며 ctr-h가 그것을 고칠 것이라고 생각하지 않습니다. 정렬 문제를 해결하고 여전히 float3을 사용할 수있는 방법에 대한 제안 사항은 무엇입니까? 어쨌든, 도와 주셔서 감사합니다. – Freddy
나는 항상 호스트 측에서 문제가있는 float3을 발견했으며, cl_float3을 사용하는 경우에도 이상한 정렬 문제를 일으키는 경향이 있습니다. 요즘에는 어디서나 float4를 사용하고 커널에서 .xyz를 사용합니다. 메모리를 절약하기 위해 애 쓰지 않는다면, 그것은 struct alignment에 대한 표준과 싸우는 것보다 나은 해결책이라고 생각합니다. – Thomas