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 명령어를 생략할 수 있음
  • 작성자가 단위를 계속 바꾸지 않았으면 좋겠다는 의견이 있었음