dx관련 alignment 정리 by 은자림

11
alignment 규칙적으로 맞춘다는 것, 효율화에 쉽다는 것 隱者林

Upload: dongchan-shin

Post on 03-Jul-2015

165 views

Category:

Engineering


7 download

DESCRIPTION

NHN NEXT Game Track Directx 관련 alignment setting 정리

TRANSCRIPT

alignment규칙적으로맞춘다는것, 효율화에쉽다는 것

隱者林

휠얼라이먼트간판 꽤 많이 눈에띈다뭐길래?

바퀴도 가지런히메모리도가지런히?

char, short, int, float, double우리는 여러자료형을 상황에맞게 쓴다그것들이 CPU로 전달 될땐 어떻게 될까?

1단계(100원)

1번 각 자료형 크기에 따라 가변적으로 보내진다2번 정해진 크기로 묶어서 보내진다

==

정답: 2번위 사진처럼정해진 alignment로자동으로맞춰져 보내진다

이때 complier에서 자동으로더해진영역을 padding이라함

당연히 개별크기로 보내는 것 보다 ‘성능’이 좋기 때문에한다!메모리가 자원인데 자원 낭비도 아니고 이유 없이 할 이유가..

그래도 저 메모리너무 아깝다...위 사진만 봐도 무려 4바이트가날아갔네ㅠㅠ

문제2: 저 메모리를챙기는방법은?(1000원)

1번 packing2번 pragma

정답: 1번Packing을통해 메모리를꽉꽉 채워 내보낼수 있음

자동 padding은 compile에 따라 방식이 다를 수 있어코드 호환성이떨어지는경우가 있다packing시일반적으로성능 효율은떨어진다

#pragma pack(push) //packing 시작#pragma pack(4) //숫자…#pragma pack(pop) //packing 끝

여기까지일반 상식...

이번에 문제가되었던D3DMATRIX16A는 오히려 alignment를요구했다error C2719: 'matView': formal parameter with __declspec(align('16')) won't be aligned해석) 16바이트로 align으로안했네? You error

왜?아니 D3D면성능이 당연히 중요할 텐데 성능 이슈가 있는 요구를 왜 아오$#@@$!@??

는 훼이크닷!

마소(MS)느님께서언제 틀렸던적이 있었나...D3DMATRIX16A연산에는 오히려 align16이성능의답이었다

Intel의 SSE, AMD의 3DNow! 등SIMD instruction을사용하는경우 보다 나은 성능

메모리로부터 SSE에서사용하는 XMM 레지스터로의데이터 로딩시16Byte 단위로정렬된 데이터가필요하다

SSE(Streaming SIMD Extensions)

실수연산에최적화된명령어 set개발자들에게 3D 그래픽 생성과핸들링을위한 실수연산에있어병행처리프로그램을지원

펜티엄-Ⅲ의혁신적이었던... 기술

요 SSE의 전용처리 레지스터가 128bit(16byte)

그래서 매트릭스연산에사용되는D3DMATIRX16A은 16byte로강제 align

해결 방안16byte로 align하라!(그 외에 방법이있나 하드웨어지원인데)

隱者林해결 방안: 다 16으로 align하라!

placement new(위치지정 new)

엇?! Effective C++에서 나온 느낌이…

operator newmalloc과 같다. 인자로 넣어준사이즈만큼할당, 메모리주소 리턴원형은 void* operator new(size_t size); 이다.

사용 예)void* pTest = operator new(sizeof(TestClass));

placement new인자로메모리가할당 되어 있는포인터를 넘겨주면, 지정 된 메모리공간을 리턴내부적으로 void* operator new(size_t, void*) 호출

사용예)void* pTest = malloc(sizeof(TestClass));new(pTest) TestClass;

언제 쓰나?

메모리를재할당 하지 않으므로, 기존 데이터가그대로남아있고,생성자에서초기화하는데이터만초기화.가상함수테이블을초기화시킨다

문법상명시적으로생성자를호출할수없을때,placement new를사용해서생성자를호출 할 수 있다.

오브젝트풀 등에서 활용 할 수 있다.사용된 메모리를 free하지않고 풀에 담아 두고 할당이 필요할때,풀에가용메모리가있으면할당하지않고초기화만해서사용한다.

Q & A