TL;DR

  • Fearless SIMD v1.0이 자동 벡터화·멀티버저닝부터 완전한 이식형 SIMD 추상화와 안전한 인트린식 접근까지 지원하며 SIMD에서 unsafe를 제거함
  • 플랫폼별 경계 사례에 대한 정밀·고속 변형, 하드웨어 네이티브 벡터 크기, 고정 벡터 크기, 플랫폼 인트린식을 제공해 성능 한계가 없음
  • kernel! 매크로와 안전한 transmute 모듈이라는 두 개의 자체 포함 구성 요소만 감사하면 전체 코드베이스의 메모리 안전성이 보장됨
  • fearless_simd_macros v0.1#[simd] 매크로가 함수 멀티버저닝의 내부 동작을 감추며, 현재 작성된 코드는 매크로 사용 여부와 관계없이 계속 동작함
  • 3년 보안 업데이트, std::simd 안정화 이후의 포팅 계획, 직접 의존하는 30개 크레이트와 간접적으로 의존하는 1,000개 이상 크레이트를 기반으로 장기적인 생태계 채택을 추진함

성능

  • 이식형 SIMD 추상화가 충분히 빠르지 않다는 비판에 대응하기 위해 Fearless SIMD가 성능을 제한하지 않도록 많은 노력을 기울임.
  • 플랫폼마다 경계 사례의 동작이 다른 연산인 셔플(swizzle)이나 부동소수점 최댓값 등에 대해 모든 플랫폼에서 동일한 정밀 변형과, 경계 사례가 발생하지 않는다고 예상할 때 사용하는 플랫폼 의존적 결과의 고속 변형을 함께 제공함.
  • SIMD 알고리즘을 하드웨어의 네이티브 벡터 크기를 기준으로 쉽게 표현할 수 있어 실행 환경과 관계없이 하드웨어를 최대한 활용함.
  • 고정 벡터 크기가 필요한 알고리즘을 위해 고정 벡터 크기도 지원함.
  • 이식형 SIMD 연산의 구현을 최신 수준으로 유지하기 위해 노력했으며, Rust와 LLVM 양쪽에 개선 사항을 업스트림으로 기여함.
  • 이식형 추상화가 다루지 않는 명령어나 더 강력한 제어가 필요한 경우, 필요한 코드 부분만 오버헤드 없이 플랫폼 인트린식으로 안전하게 내려갈 수 있으며 나머지 코드는 단순하고 이식 가능하게 유지함.
  • 인트린식에 안전하게 접근할 수 있으므로 성능 상한이 없음.

안전성

  • 다른 SIMD 추상화의 소스 코드를 확인하면 수천 개의 unsafe 블록이 발견될 정도로 unsafe 코드가 가득한 경우가 일반적임.
  • Fearless SIMD는 임시적인 unsafe 코드를 요구하지 않도록 세심하게 설계됨.
  • 핵심 구성 요소 중 하나는 kernel! 매크로이며, 컴파일러의 target feature v1.1을 활용해 대부분의 SIMD 인트린식을 unsafe 없이 호출함.
  • 이 설계는 대부분의 임시 unsafe 코드를 제거하지만 원시 포인터를 사용하는 SIMD 로드·스토어 연산까지 다루지는 않음.
  • 이를 위해 bytemuckzerocopy 같은 크레이트에서 영감을 받은 안전한 transmute 모듈을 사용함.
  • _mm_loadu_epi32 같은 SIMD 인트린식은 특수해 보이지만 내부적으로 일반 로드·스토어 연산으로 변환되므로, 재사용 가능한 단일 래퍼로 기능 전체를 재현할 수 있음.
  • Rust 타입 시스템 덕분에 감사가 필요한 대상은 이 두 개의 작고 자체 포함된 구성 요소뿐임.
  • 두 구성 요소가 메모리 안전하면 나머지 코드베이스도 메모리 안전하다는 보장이 성립함.
  • Rust에서 SIMD가 진정으로 두려움 없는 방식으로 사용되는 단계에 도달함.

사용 편의성

  • 함수 멀티버저닝은 까다로운 작업임.
  • 기존 방식은 #[inline(always)] 주석을 추가하고 그 의미를 이해해야 하거나, 모든 함수 호출에 작은 오버헤드를 부과함.
  • 후자의 오버헤드는 대부분의 경우 문제가 없지만 매우 작은 함수의 성능을 저하하며, 이를 우회하려면 여전히 필요한 곳에 #[inline(always)]를 정밀하게 추가해야 함.
  • 두 방식 모두 내부 동작을 직접 고려해야 하는 누수된 추상화임.
  • fearless_simd v1.0과 함께 출시되는 fearless_simd_macros v0.1은 누수되지 않는 추상화인 #[simd] 매크로를 제공함.
  • SIMD 함수에 매크로를 붙이기만 하면 내부에서 무슨 일이 일어나는지 고려하지 않아도 동작함.
  • 생태계에 큰 진전을 제공하지만 여전히 일부 보일러플레이트가 남아 있음.
  • Struct Target Features RFC를 통한 컴파일러 지원으로 #[simd] 주석 자체를 제거하거나, 향후 탐색할 다른 기법으로 보일러플레이트를 더 줄이는 방안을 검토 중임.
  • 절차적 매크로를 선호하지 않는 경우에는 편의성이 낮더라도 기존 방식도 계속 사용할 수 있음.
  • 사용 편의성은 앞으로도 발전할 가능성이 있는 영역이지만, 핵심 fearless_simd 크레이트의 안정성 보장을 훼손하지 않음.
  • 현재 #[simd] 매크로 사용 여부와 관계없이 작성된 코드는 앞으로도 계속 동작함.

안정성

  • Fearless SIMD는 장기적으로 유지되는 것을 목표로 하며, v1.0과 이후 모든 버전에 대해 3년간 보안 업데이트를 제공함.
  • 미래를 확정할 수는 없지만, 단기적인 Rust 기능인 f16 타입과 장기적인 기능인 SVE 및 RISC-V Vector Extension을 지원할 수 있는 실현 가능한 경로가 존재하며, 해당 하드웨어 확장이 중요해지더라도 API를 깨는 변경은 필요하지 않음.

`std::simd`와의 관계

  • std::simd가 안정화되기를 기대하지만, std::simd 안정화가 Fearless SIMD를 쓸모없게 만들지는 않음.
  • Rust 표준 라이브러리는 반드시 포함해야 하는 부분만 구현하며, 멀티버저닝이나 하드웨어 폭 벡터 같은 나머지 기능은 생태계 크레이트에 맡김.
  • fearless_simd는 안정화된 Rust에서 동작하는 std::simd의 동등한 기능을 포함하지만, 이는 더 큰 구성의 일부에 불과함.
  • std::simd가 안정화되면 Fearless SIMD를 그 위로 포팅해 많은 사용자 정의 코드를 삭제하고 다양한 비주류 플랫폼을 지원할 계획임.
  • 그 이후에도 fearless_simd 같은 생태계 크레이트의 필요성은 유지됨.

채택

  • 아무도 사용하지 않는다면 크레이트가 아무리 뛰어나도 의미가 없음.
  • Fearless SIMD는 이미 30개 크레이트가 직접 의존하고 있으며, 1,000개가 넘는 크레이트가 간접적으로 의존함.
  • 이미 Rust 생태계의 상당한 부분을 뒷받침하고 있으며, v1.0이 채택을 더욱 확대하기를 기대함.
  • 프로젝트에 Fearless SIMD를 사용하려면 문서와 예제를 확인하고 Zulip에서 질문할 수 있음.