Debug Mode
Release Mode
손수 구현한 4x4 행렬의 역행렬 구하기 pure C++ 버전이랑 SIMD 버전 비교해봤는데
디버그 모드에서는 SIMD쪽이 무려 8배 느리게 나오고
릴리즈 모드에서는 SIMD쪽이 3배 조금 안되게 빠르게 나옴
검색해보니 SIMD 인트린직 함수들이 디버그 모드에서는 테러블한 코드로 컴파일 될 때가 많다네 ㄷㄷ
평소에 코드 로직에 따른 차이를 따져보려면 컴파일러가 대신 보상해주는 부분 배제하기 위해 디버그 벤치마크도 중요하다고 생각했는데
SIMD쪽에서는 그렇게 생각하면 안되겠네 ㅋ
비교대상이 뭔지도 봐야 되는데 경우에 따라서 simd 직접 안써도 컴파일러가 최적화해주거든 명시적으로 사용하라고 표기할 수도 있고
그걸로 SIMD 코드의 디버그 vs 릴리즈 차이가 극심하다는 이야기는 설명이 안되는 듯.. 릴리즈 모드에서는 SIMD로 구현한 쪽이 훨씬 빠른걸로 보아서 컴파일러의 자동 벡터화를 뛰어넘는 명시적인 SIMD 사용의 효율성이 존재하는건 분명한데, 디버그 모드에서는 반대로 너무 처참
꼭 그렇다는게 아니라 simd 어셈 명령어 비교할거면 컴파일된 어셈 코드를 보는게 더 나을거 같은데
아무래도 그래봐야겠음 방금 GLM 라이브러리 사용한 버전도 테스트해봤는데 (GLM_FORCE_INTRINSICS 매크로 넣어서) 이놈도도 디버그 모드 처참하고 릴리즈 모드는 준수하네 (glm simd 구현이 너무 여러 플랫폼을 다뤄서 덜 성숙한지 내 버전이 더 빠름)
원래 유명한(?) 이야기 - dc App
https://stackoverflow.com/a/58366194
- dc App
ILP 를 생각해 짠 코드도 디버그 환경에서는 레지스터 스필 문제로 10배 이상 느릴 때가 많음. 디버그와 릴리스는 아예 다른 코드로 취급해야 함
intrinsic은 릴리즈에서만 빠르고 디버그에서 빠르고싶으면 인라인어셈 직접 쓰셈 - dc App
ㄹㅇ ㄷ버그로 성능측정 왜함
디버깅을 하기위해 붙는 코드들 엄청많음