| import torch |
|
|
| from kernels.benchmark import Benchmark |
|
|
|
|
| LAYOUT_SHAPES = [ |
| ("rows1_d4096", 1, 4096), |
| ("rows2_d4096", 2, 4096), |
| ("rows31_d4096", 31, 4096), |
| ("rows32_d4096", 32, 4096), |
| ("rows33_d4096", 33, 4096), |
| ("rows127_d4096", 127, 4096), |
| ("rows128_d4096", 128, 4096), |
| ("rows129_d4096", 129, 4096), |
| ("rows16_d1024", 16, 1024), |
| ("rows16_d2048", 16, 2048), |
| ("rows16_d8192", 16, 8192), |
| ("rows16_d12288", 16, 12288), |
| ("rows64_d16384", 64, 16384), |
| ] |
|
|
|
|
| def _reference_swizzle(scales: torch.Tensor) -> torch.Tensor: |
| rows, n_blocks = scales.shape |
| n_col_super = (n_blocks + 3) // 4 |
| src = scales.cpu() |
| out = torch.zeros( |
| ((rows + 127) // 128) * n_col_super * 512, |
| dtype=torch.uint8, |
| ) |
| for row in range(rows): |
| rb = row // 128 |
| ri = row % 128 |
| for blk in range(n_blocks): |
| cb = blk // 4 |
| ci = blk % 4 |
| super_idx = rb * n_col_super + cb |
| inner_off = (ri % 32) * 16 + (ri // 32) * 4 + ci |
| out[super_idx * 512 + inner_off] = src[row, blk] |
| return out.to(scales.device) |
|
|
|
|
| class Nvfp4ScaleFactorReshapeBenchmark(Benchmark): |
| seed = 7 |
|
|
| def _setup_shape(self, rows: int, D: int) -> None: |
| self.scales = torch.randint( |
| 0, |
| 256, |
| (rows, D // 16), |
| device=self.device, |
| dtype=torch.uint8, |
| ) |
| n_col_super = ((D // 16) + 3) // 4 |
| self.out = torch.zeros( |
| ((rows + 127) // 128) * n_col_super * 512, |
| device=self.device, |
| dtype=torch.uint8, |
| ) |
|
|
| def _reference(self): |
| return _reference_swizzle(self.scales) |
|
|
| def setup_rows1_d4096(self): |
| self._setup_shape(1, 4096) |
|
|
| def benchmark_rows1_d4096(self): |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify_rows1_d4096(self): |
| return self._reference() |
|
|
| def setup_rows16_d12288(self): |
| self._setup_shape(16, 12288) |
|
|
| def benchmark_rows16_d12288(self): |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify_rows16_d12288(self): |
| return self._reference() |
|
|
| def setup_rows64_d16384(self): |
| self._setup_shape(64, 16384) |
|
|
| def benchmark_rows64_d16384(self): |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify_rows64_d16384(self): |
| return self._reference() |
|
|
| def setup_rows128_d4096(self): |
| self._setup_shape(128, 4096) |
|
|
| def benchmark_rows128_d4096(self): |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify_rows128_d4096(self): |
| return self._reference() |
|
|
| def setup_rows129_d4096(self): |
| self._setup_shape(129, 4096) |
|
|
| def benchmark_rows129_d4096(self): |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify_rows129_d4096(self): |
| return self._reference() |
|
|
|
|
| def _register_layout_shapes() -> None: |
| for label, rows, D in LAYOUT_SHAPES: |
|
|
| def setup(self, rows=rows, D=D) -> None: |
| self._setup_shape(rows, D) |
|
|
| def benchmark(self) -> None: |
| self.kernel.nvfp4_sf_linear_to_swizzled(self.scales, out=self.out) |
|
|
| def verify(self): |
| return self._reference() |
|
|
| setattr(Nvfp4ScaleFactorReshapeBenchmark, f"setup_{label}", setup) |
| setattr(Nvfp4ScaleFactorReshapeBenchmark, f"benchmark_{label}", benchmark) |
| setattr(Nvfp4ScaleFactorReshapeBenchmark, f"verify_{label}", verify) |
|
|
|
|
| _register_layout_shapes() |
|
|