▲GN⁺ 2024-07-05 | parent | ★ favorite | on: 행복한 재미있는 분기 예측기 조롱 금지 (2023)(mattkeeter.com)Hacker News 의견 Apple II 시절의 친구들과 함께 기사를 요약했음 최적화된 코드가 1024개의 32비트 부동 소수점 숫자를 합산하는 데 94 나노초가 걸림 1 MHz 6502는 94 나노초 동안 첫 번째 명령어의 첫 번째 바이트를 메모리에서 가져오려고 할 것임 이 코드는 캐시에서 실행될 때만 최적화된 성능을 발휘함. DRAM은 느림 Raymond Chen이 거의 20년 전에 동일한 주제를 다뤘음 루프 종료를 확인한 후 분기 없이 foo 함수로 넘어감 기본적인 예측 휴리스틱을 위반한 것임 분기 예측기가 반환 주소의 그림자 스택을 유지하는 것은 수십 년 동안 존재해 왔음 SIMD 코드에는 부동 소수점 덧셈이 결합법칙을 따르지 않기 때문에 다른 순서로 합산을 수행할 수 있음 이는 컴파일러가 SIMD 명령어를 생성하지 않는 이유일 수 있음 부동 소수점 합산은 기본적으로 오류 범위를 가지며, 그 범위 내의 모든 답변은 유효함 특수한 부동 소수점 입력이 있는 경우 언어는 이를 명시적으로 인코딩할 수 있는 수단을 제공해야 함 Rust 1.78 이후 컴파일러는 더 공격적인 루프 언롤링과 약간의 SIMD를 사용함 루프 언롤링은 Rust 1.59에서 시작됨 Github 코드에서는 Rust 1.67.0-nightly 버전을 사용하고 있었음 ARM/ARM64 어셈블리에서 x0가 어떻게 증가하는지 혼란스러웠음 ldr s1, [x0], #4 명령어가 x0를 4만큼 증가시키면서 로드함 x86_64에는 한 번에 로드하고 증가시키는 단일 명령어가 없음 어셈블리 코드를 최적화하기 위해 덜 복잡한 방법을 시도하지 않은 것이 놀라움 루프의 맨 아래에서 하나의 분기만 필요하도록 어셈블리 코드를 재작성할 수 있음 foo를 인라인하고 RET 명령어를 생략할 수 있음 작성자가 단위를 계속 바꾸지 않았으면 좋겠다는 의견이 있었음
Hacker News 의견
Apple II 시절의 친구들과 함께 기사를 요약했음
Raymond Chen이 거의 20년 전에 동일한 주제를 다뤘음
SIMD 코드에는 부동 소수점 덧셈이 결합법칙을 따르지 않기 때문에 다른 순서로 합산을 수행할 수 있음
Rust 1.78 이후 컴파일러는 더 공격적인 루프 언롤링과 약간의 SIMD를 사용함
ARM/ARM64 어셈블리에서 x0가 어떻게 증가하는지 혼란스러웠음
어셈블리 코드를 최적화하기 위해 덜 복잡한 방법을 시도하지 않은 것이 놀라움
작성자가 단위를 계속 바꾸지 않았으면 좋겠다는 의견이 있었음