컴퓨터 공학

[퍼옴] __declspec(align(32)) volatile 해석하기

혼새미로 2017. 3. 18. 16:05
반응형

__declspec( align( # ) )

프로세서의 캐쉬 성능을 항샹시키기 위해 사용한다.

데이터가 프로세서의 캐쉬라인에 특정크기로 할당되게 하여 캐시 성능을 높인다.

#은 Byte 값 이고 2의 제곱승으로 1부터 8192(bytes) 까지 가능하다.

구조체, 유니온, 클래스 와 변수에 사용할 수 있다.

함수의 인자 (스택 변수) 에는 사용 할 수 없다.

VC는 기본적으로 데이터 멤버 중 최소 크기값으로 설정하거나 packing setting (pragma pack()) 에 설정된 값으로 잡는다.

ex)

__declspec(align(32) ) struct s1

{

    int a, b, c, d;  // sizeof(struct s1)는 32. 16바이트가 덧붙여진다.

}


__declspec(align(8)) struct s2

{

    int a, b, c, d;  // sizeof(struct s2)는 16.

}



struct s3

{

    int a;             // 4바이트 다음에 28바이트가 덧붙여 진다.

    struct s1 b;   // b의 오프셋은 32에서 시작. sizeof(s3)는 64

}


MSDN: http://msdn.microsoft.com/en-us/library/83ythb65(v=vs.80).aspx

참고 블로그  http://pmguda.com/378

캐쉬 false sharing 문제 http://minjang.egloos.com/1848130 


volatile

사전적 의미 : 휘발성

프로그래밍적 의역 : 쉽게 변하는 놈이니까 최적화를 위해 캐싱하지 마라!

해당 변수를 컴파일러가 최적화 하지 못하도록 억제한다.

멀티 쓰레딩 환경에서 컴파일러가 캐쉬에 최적화를 해놓으면 ABA Problem 발생

멀티 쓰레딩 상황에서 다른 프로세스가 변수의 값을 변경해 놓아도 바로 읽을 수 있기위해 다른 동기화 객체(Interlocked 등)와 함게 쓰인다.


__declspec(align(32)) volatile 이란 멀티 쓰레딩 환경에서 동기화를 위해 32 Bytes 경계영역으로 캐쉬되는 데이터 형!


출처 : http://y2kay.blogspot.kr/2012/05/declspecalign32-volatile.html

반응형