diff --git a/qwen3_6_scripts/mamba_cache.py b/qwen3_6_scripts/mamba_cache.py index 7537b9e9..8a3795f1 100644 --- a/qwen3_6_scripts/mamba_cache.py +++ b/qwen3_6_scripts/mamba_cache.py @@ -70,10 +70,15 @@ class MambaCacheManager: return tuple(buffer[:, :batch_size] for buffer in self.mamba_cache) def _swap_mamba_cache(self, from_index: int, to_index: int): + # CCCL DeviceCopy::Batched uses separate src/dst buffers — never + # in-place scatter. PyTorch advanced indexing assignment + # cache[:, [a,b]] = cache[:, [b,a]] has undefined evaluation order. + # Use explicit temp clone for correctness. assert len(self.mamba_cache) > 0 for cache_t in self.mamba_cache: - cache_t[:, [to_index,from_index]] = \ - cache_t[:, [from_index,to_index]] + tmp = cache_t[:, from_index].clone() + cache_t[:, from_index].copy_(cache_t[:, to_index]) + cache_t[:, to_index].copy_(tmp) def _copy_mamba_cache(self, from_index: int, to_index: int): assert len(self.mamba_cache) > 0