합에 해당하는 변수를 두고, 100000번 랜덤함수 int 값을 합치는 등의
더미계산을 한다고 하자,
gcc -O2 만 하는 것이면 속도 최적화로 충분할 것이다. 그런데
sum이 아닌 int* sum을 사용하고 , *sum에다가 합계를 하는 방식을 사용할 때는 어떨까?
이래도 크게 문제가 없어보이기는 하지만, 포인터라는건, union에서의 변수 포인터인지, struct또는
class에서 변수 위치인지 알 수가 없기 때문에, 컴파일러는최적화를 하기 어려워한다.
그럴 때, struct alignas(64) S {int a} ; 와 같은 방식의 구조체를 사용한다면, 뭔가 다른게 없어야 할 것 같지만
속도가 2배 빨라진다.
이유는 간단하다.
캐시라인 한개를 통째로 외부 값을 집어넣으면, 안에서 생성되는 난수는 다른 캐시라인에 들어가고, 그안에서 최적화를 끝낸 후 더하는 식으로 최적화가 이루어진다.
정확히는 알기 어렵지만 그러하다.
댓글 없음:
댓글 쓰기