2012-12-11 3 views
2

정렬되지 않은 구조에 문제가 있습니다. 여기에 포함 된 구조는 다음과 같습니다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 카드에서 충돌을 막을 수 있습니까?

감사합니다.

+0

UPDATE : 엔비디아, ATI와 인텔과 내 경험에서
는, 다음은 가장 안전한 방법입니다 난 그냥 문제가 떨어진 12.8 드라이버에 갔다 발견했다. 나는 12.10 드라이버가 컴파일러에서 무언가를 깨뜨렸다 고 생각한다. – Cthutu

답변

0

배열의 배열은 16 바이트 경계에 정렬되어야한다는 것을 알고 계십니까?
"더미"배열이란 무엇입니까? 심? 그렇다면 패딩에 배열을 사용하지 마십시오.

struct Ray 
{ 
    float4 origin; 
    float4 dir; 
    float len; 
    float padding1; 
    float padding2; 
    float padding3; 
}; 

struct RayStack 
{ 
    struct Ray r[STACK_DEPTH]; 
    int depth[STACK_DEPTH]; 
    float refr[STACK_DEPTH]; 
    int top; 
    float padding1; 
    float padding2; 
    float padding3; 
};