이 블로그 검색

2023년 12월 27일 수요일

Cache Line Alignment 속도 최적화 in c++ (c도 가능할 듯)

합에 해당하는 변수를 두고, 100000번 랜덤함수 int 값을 합치는 등의 

더미계산을 한다고 하자,   

gcc -O2 만 하는 것이면 속도 최적화로 충분할 것이다. 그런데 

sum이 아닌 int* sum을 사용하고 , *sum에다가 합계를 하는 방식을 사용할 때는 어떨까?

이래도 크게 문제가 없어보이기는 하지만,  포인터라는건,  union에서의 변수 포인터인지, struct또는 
class에서 변수 위치인지 알 수가 없기 때문에, 컴파일러는최적화를 하기 어려워한다. 


그럴 때,  struct alignas(64) S {int a} ; 와 같은 방식의 구조체를 사용한다면, 뭔가 다른게 없어야 할 것 같지만 
속도가 2배 빨라진다. 

이유는 간단하다. 

캐시라인 한개를 통째로 외부 값을 집어넣으면, 안에서 생성되는 난수는 다른 캐시라인에 들어가고, 그안에서 최적화를 끝낸 후 더하는 식으로 최적화가 이루어진다. 

정확히는 알기 어렵지만 그러하다. 

댓글 없음:

댓글 쓰기

가장 많이 본 글