[furiosa-opt v0.8.1] HBM window offset 부여 시 BufferTooSmall 오류

# host에서 만든 HBM window를 offset 0이 아닌 위치로 넘기면 BufferTooSmall이 납니다

커스텀 커널을 여러 개 이어 붙이는 파이프라인을 만들다가 HBM view 인자에서 막힌 부분이 있어 여쭙습니다. 최소 재현 크레이트 `rngd-hbm-window-repro`를 첨부했습니다. Furiosa Opt 0.8.1, RNGD 1칩에서 실측했습니다.

## 관찰

8개 group으로 된 HBM tensor 하나를 두고, 커널 하나가 그중 한 group(64 KiB)에만 쓰도록 했습니다.

```rust

axes![Group = 8, Row = 8, Col = 2048];

pub type Groups = HbmTensor<i32, m![1], m![Group, Row, Col]>; // 512 KiB

pub type GroupWindowMut<'a> = HbmTensorViewMut<'a, i32, m![1], m![Group = 1 #{!} 8, Row, Col]>;

// host

let window = groups.view_mut().tile::<m![Group], 1, m![Group = 1 #{!} 8, Row, Col]>(g);

launch(write_window, (&mut ctx, &plane, window)).await

// device

#[device(chip = 1)]

pub fn write_window(ctx: &mut Device, input: &Plane, window: GroupWindowMut<'_>) {

let dm: PlaneDm = input.to_dm(&mut ctx.tdma);

dm.view().to_hbm_view(&mut ctx.tdma, window);

}

```

CPU backend에서는 모든 g에서 정상이었습니다. 실제 RNGD에서는 g = 0일 때만 되고, 그 밖에는 launch가 거절됐습니다.

| 경우 | RNGD |

| — | — |

| 전체 tensor를 offset 0으로 넘기고 커널 안에서 group 3을 tile | 정상 |

| host window, g = 0 | 정상 |

| host window, g = 3 | `BufferTooSmall { slot: 1, needs: 524288, has: 327680 }` |

| host window, g = 7 | `BufferTooSmall { slot: 1, needs: 524288, has: 65536 }` |

| host 읽기 window(`Group = 1 # 8`), g = 3 | `BufferTooSmall { slot: 0, needs: 524288, has: 327680 }` |

`needs`가 항상 tensor 전체 크기(8 group = 512 KiB)이고 `has`가 `(8 − g) × 64 KiB`라서, 런타임이 view 인자의 크기는 padding까지 포함한 mapping 전체로 요구하고 실제로는 window 시작점부터 allocation 끝까지만 넘기는 것으로 보였습니다. allocation을 더 크게 잡아도 view의 padding이 base axis 크기를 따라 같이 커져서 피할 수 없었습니다.

## 왜 문제가 되는지

지금은 커널 안에서 tile하는 방식으로 피하고 있습니다. 그런데 이러면 "몇 번째 group에 쓰는지"만 다른 커널을 group마다 따로 만들어야 합니다. 저희 파이프라인에는 이런 변형이 14개 있고, 변형끼리 연달아 launch할 때마다 image를 새로 올리는 비용(launch 사이 약 40~80 µs, 같은 커널 반복은 약 14 µs)이 붙어서 전체 시간의 큰 부분을 차지하고 있습니다. host window를 쓸 수 있으면 같은 커널 하나를 offset만 바꿔 반복 launch할 수 있습니다. (image 전환 비용 자체는 따로 글을 올렸습니다.)

## 질문

1. offset이 있는 host window(`HbmTensorView`/`HbmTensorViewMut`)를 커널 인자로 넘기는 것이 의도된 사용법인지, 아니면 지원하지 않는 경우인지 궁금합니다.

2. 지원하는 경우라면 런타임이 window 크기를 mapping 전체가 아니라 실제 접근 범위로 검사하도록 바뀔 수 있을까요? 아니면 지금 쓸 수 있는 다른 방법이 있을까요? 예를 들어 offset을 launch 인자로 넘기는 방법이나, 같은 image에서 서로 다른 HBM 위치를 쓰는 방법이 있는지 궁금합니다.

안녕하세요, report 감사합니다. 이 경우는 runtime과 compiler가 서로 다른 크기 기준을 쓰고 있는 bug 로 확인되었습니다. 불편을 끼쳐 죄송합니다. host window는 example이 있는 의도된 사용법이고 runtime의 assertion이 padding을 고려하지 않아서 과도하게 막고 있는것인데요, 다음 release (다음주 중)에 빠르게 fix 하도록 하겠습니다.

release 후 이 스레드에 답변드리겠습니다.