[C/C++] Fails Sharing / alignas(32)

그림자왕국·2020년 10월 8일
1

C++

목록 보기
11/24
post-thumbnail

Fails Sharing

CPU의 캐시는 한 번에 캐시 라인(64byte)만큼 데이터를 읽어들인다.

Cat 객체를 생성할 때 일반적으로 생성하면 data alignment로 인해 24byte의 크기가 소요된다.

이 크기의 객체로 배열을 생성할 경우 24, 48, 72 ... 이렇게 인덱스가 나눠지는데

CPU 캐시 라인이 64byte라고 가정할 때 [2] 인덱스부터는 객체를 한 번에 캐시로 읽어들일 수
없고 (72 / 64 = 1.125)

해당 인덱스(객체)를 쪼개서 읽어야 하는 Fails Sharing 문제가 발생하게 된다.

Solution

따라서 객체가 중간에 쪼개지는 것을 방지하기 위해 클래스에 alignas(32) 키워드를 붙여

처음부터 객체 크기를 32byte로 고정시키도록 한다.

그리하여 32byte로 배열을 생성하면 캐시 라인(64byte)에 맞게 정확히 배열 인덱스를 나눌 수

있기에 객체가 중간에 쪼개지는 현상을 방지할 수 있어서 성능 향상을 얻을 수 있다.

Fails Sharing

CPU에 코어가 2개 있고 [2]번 인덱스에 접근하려 할 경우

[2]번 객체의 절반은 1번 코어 L1 캐시에 나머지는 2번 코어 L1 캐시에 들어가가게 된다.

즉, 각각의 코어가 같은 공간(객체)에 접근하는 레이스 컨디션 문제다.

profile
언리얼 엔진 매니아입니다.

0개의 댓글