같은 정수 합산 루프라도 데이터를 읽는 순서만 바꾸면 CPU 실행 시간이 크게 달라진다는 흥미로운 실험 결과가 발표되었습니다. 이 실험은 의도적으로 CPU의 캐시(cache), 프리페처(prefetcher), 그리고 DRAM(Dynamic Random-Access Memory) 동작을 방해하는 데이터 접근 패턴을 만들어, 일반적인 선형 접근보다 10배 이상, 심지어 무작위 접근보다도 30% 이상 느린 성능을 기록했습니다.
연구팀은 2^26개의 32비트 정수 배열을 대상으로 다양한 접근 패턴을 테스트했습니다. 가장 빠른 선형 접근(linear access)은 약 1.3억 사이클이 소요된 반면, 무작위 순서로 데이터를 읽는 피셔-예이츠 셔플(Fisher-Yates shuffle)은 약 15.7억 사이클로 10배 이상 느려졌습니다. 여기서 더 나아가, 캐시 라인(cache line)과 페이지(page) 경계를 의도적으로 건너뛰는 패턴을 적용하자 성능은 더욱 악화되었습니다. 특히 8페이지 간격으로 데이터를 접근하는 패턴은 CPU의 주소 변환 캐시(PTE cache) 지역성까지 깨뜨려 20.6억 사이클을 기록, 무작위 접근보다도 훨씬 느린 결과를 보였습니다. 이는 4KB 페이지 경계를 넘는 프리페치를 하지 않는 인텔(Intel) CPU의 특성과, L1d 캐시의 집합 연관(set-associative) 방식이 맞물려 캐시 재사용 효율이 극도로 낮아졌기 때문입니다.
마지막으로 DRAM 컨트롤러의 뱅크(bank) 및 로우(row) 충돌을 유도하는 패턴까지 시도했습니다. DRAM은 같은 뱅크 내에서 다른 로우를 접근할 때마다 기존 로우를 닫고 새 로우를 활성화하는 과정(precharge/activation)이 필요해 지연이 발생합니다. 물리 주소의 DRAM 매핑이 플랫폼 의존적이라 완벽하게 제어하기는 어려웠지만, 이 패턴은 약 20.8억 사이클을 기록하며 가장 느린 성능을 보였습니다. 이 실험은 단순한 데이터 접근 순서 변경만으로도 CPU와 메모리 계층 구조의 복잡한 상호작용이 성능에 얼마나 큰 영향을 미치는지 명확히 보여줍니다. 개발자들이 메모리 접근 패턴을 최적화하는 것이 고성능 애플리케이션 개발에 필수적임을 시사합니다.