diff --git a/cutedsl/bridge.py b/cutedsl/bridge.py index e79cc5b7..57d2a52e 100644 --- a/cutedsl/bridge.py +++ b/cutedsl/bridge.py @@ -228,16 +228,15 @@ def quantize_weight_to_nvfp4(w_bf16, block_size=SF_VEC_SIZE): # ── Tensor Layout Conversion ─────────────────────────────────────────── def make_b_k_major(b_tensor): - """Convert B tensor from N-major to K-major (required by kernel). + """Convert B tensor from N-major to K-major layout. - Input: (E, K_packed, N) — may be N-major or K-major - Output: (E, K_packed, N) contiguous in K-major order (stride of K_packed dim == 1) + The kernel expects B with stride (E*K*N, 1, K) — K is contiguous. + torch.stack produces stride (E*K*N, N, 1) — N is contiguous. - For shape (E, K, N): K-major means stride[1]==1, N-major means stride[2]==1. + double-permute trick: transpose, make contiguous, transpose back. + Same shape, but K-contiguous memory layout. """ - if b_tensor.dim() == 3 and b_tensor.stride(1) == 1: - return b_tensor.contiguous() - return b_tensor.permute(0, 2, 1).contiguous() + return b_tensor.permute(0, 2, 1).contiguous().permute(0, 2, 1) def compute_expert_offsets(tokens_per_expert, num_experts, device="cuda"):