고급 컴파일러 최적화에는 본질적인 한계가 있으며, 그 때문에 자동 벡터화 같은 공격적인 성능 기능이 종종 기대만큼 동작하지 않습니다.
가장 큰 이유는 컴파일러가 속도보다 프로그램의 올바른 동작(정확성)을 우선해야 하기 때문입니다. 특히 메모리 안전성과 관련해 해석이 조금이라도 모호하면, 컴파일러는 안전 쪽으로 판단해 최적화를 하지 않을 수밖에 없습니다. 다시 말해, 확실하지 않으면 최적화를 포기합니다.
이 컴파일러 최적화 한계는 크게 세 가지로 정리됩니다:
첫째는 데이터 의존성과 메모리 모호성으로, 포인터 별칭(aliasing)이나 반복마다 이전 결과에 의존하는 루프(루프-캐리 의존성, Loop-Carried Dependencies) 때문에 연산을 동시에 처리하기 어렵습니다.
둘째는 코드 구조의 제약으로, 반복 횟수를 알 수 없는 루프나 루프 내부의 복잡한 분기(complex branching)와 제어 흐름(control flow)이 최적화를 막습니다.
셋째는 외부 요인과 정밀도 요구로, 정렬되지 않은(unaligned) 데이터, 필요한 함수 인라이닝(function inlining), 엄격한 부동소수점 정밀도 규칙(strict floating-point precision rules) 등이 컴파일러가 안전하게 최적화를 적용할 수 있는 범위를 더 좁힙니다.
#프로그래밍 #코딩 #컴퓨터과학 #개발자 #c언어