정렬되지 않은 구조에 문제가 있습니다. 여기에 포함 된 구조는 다음과 같습니다ATI/AMD OpenCL의 로컬 변수 정렬
struct Ray
{
float4 origin;
float4 dir;
float len;
float dummy [3];
};
struct RayStack
{
struct Ray r [STACK_DEPTH];
int depth [STACK_DEPTH];
float refr [STACK_DEPTH];
int top;
float dummy [3];
};
덧붙여, STACK_DEPTH 내가 모든 구조의 크기가 16의 배수가 있는지 확인하기 위해 신중 한 4의 배수이고 내 float4 년대가 정렬 된 경계에 있는지 . I 로컬 변수로 사용하면
문제는, 구조 RayStack 정렬되지 않은이다
struct RayStack stack;
printf("stack: %p\n", &stack);
스택 주소 8 끝나는 끝과 0이 아닌 I가 16 바이트 정렬 된 원하는 것처럼 구조. 이로 인해 ATI 카드에서 충돌이 발생합니다 (인텔과 nVidia는 그다지 신경 쓰지 않습니다). 구조체에 (전후) __attribute __ ((aligned (16))) 및 로컬 변수 정의에 배치를 시도했지만 아무 것도 변경하지 않습니다. 사실, printf 문을 추가하는 방법을 모르겠지만 문제가 해결되었습니다.
로컬 변수 스택이 16 바이트 경계에 정렬되도록하고 ATI 카드에서 충돌을 막을 수 있습니까?
감사합니다.
UPDATE : 엔비디아, ATI와 인텔과 내 경험에서
는, 다음은 가장 안전한 방법입니다 난 그냥 문제가 떨어진 12.8 드라이버에 갔다 발견했다. 나는 12.10 드라이버가 컴파일러에서 무언가를 깨뜨렸다 고 생각한다. – Cthutu