flashrt-nvfp4 / benchmarks /benchmark_nvfp4_sf_reshape.py
liangsu9988's picture
Uploaded using `kernel-builder`.
b9f8d14 verified
Raw
History Blame
3.6 kB
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()