[furiosa-opt v0.6.0] v0.3.0 에서 동작하던 transpose/gelu 커널이 v0.6.0 emulation에서 실패 - 권장 패턴 문의

안녕하세요.

furiosa-opt-std v0.3.0 API로 작성한 커널 코드를 v0.6.0 API를 반영하여 수정 및 보완하고 있습니다.

이전 버전에서 테스트 진행했던 대부분 커널(contraction, elementwise 등)은 API 변경 사항(to_hbm 시그니처 변경, contract_outer Acc 추가 등)에 맞춰 수정한 후 v0.6.0 emulation 백엔드에서 정상 동작하는 것을 확인했습니다.

다만, v0.3.0 simulation 백엔드에서 정상 동작하던 2개 커널이 v0.6.0에서 실패하여 문의드립니다.

테스트 환경

  • furiosa-opt-std : v0.6.0
  • cargo-furiosa-opt : v0.6.0 (cargo binstall로 설치)
  • rust-toolchain : nightly-2026-05-01
  • 백엔드 : emulation
  • OS : Ubuntu 24.04 (Docker 컨테이너)

Docker 컨테이너를 사용하는 이유는 기존 v0.3.0 호스트 환경을 보존하면서 v0.6.0을 격리 환경에서 테스트하기 위함이며, Rust toolchain과 furiosa-opt-std 설치는 공식 문서 절차를 따랐습니다.

1. transpose 커널

v0.3.0 simulation에서 정상 동작하던 f32 transpose (M×N → N×M)가 v0.6.0 emulation에서 lowering 단계 에러가 발생합니다.

다양한 축 조합(M=2/8/2048, N=8/32, f32/bf16)을 시도했으나 모두 lowering 에러 또는 "fatal runtime error: foreign exceptions"가 발생했습니다.

질문: v0.6.0에서 transpose의 권장 구현 패턴이 변경되었는지요? 또는 별도의 접근 방법이 필요한지 알려주시면 감사하겠습니다.

2. gelu 커널

v0.3.0에서 Stash API를 사용하여 구현한 GELU 커널이 v0.6.0에서 API 변경으로 빌드에 실패하는 것 같습니다. Stash 관련 API의 v0.6.0 대응 방법이 있는지 문의드립니다.

참고

contraction(gemm, gemv), elementwise(add, mul, silu, rsqrt, xnorm) 등 다른 커널 유형은 v0.6.0 API에 맞춰 수정 후 emulation에서 정상 동작합니다.

늦은 답변 죄송합니다.
1. transpose 커널
transpose engine과 관련하여 emulation backend에서 에러가 나는 부분에 대해서는 인지하고 있습니다. 이는 transpose engine의 semantics를 현재 sequencing으로 정확히 표현하기 어려운 데서 발생하는 문제입니다. 실제 NPU 실행에는 영향을 주지 않는 이슈이기 때문에, 현재 우선순위상 단기간 내 emulation backend 쪽 수정 계획은 없습니다.
2. gelu 커널
0.3.0과 0.6.0 사이에, Stash에 대해서 두 가지 제약: 1. Stash된 텐서를 한 번만 사용 가능하고, 2. Stash를 쓰고 읽는 alu의 Way수가 같아야한다는 제약이 생긴 점 때문으로 추측됩니다. 최신 버전이 하드웨어 제약을 더 충실히 표현합니다.

안녕하세요, 답변 감사드립니다.

transpose 커널 문제가 실제 NPU 실행에는 영향을 주지 않는다는 것과 gelu 커널의 경우 버전 업데이트 이후에 하드웨어 제약 검사 부분이 더 엄격해졌다는 것 모두 이해하였습니다.