from . import benchmark class ConvImplBench(benchmark.Benchmark): def __init__(self, case, mode, device, dtype, kernel_size, N, iC, H, W, oC): super().__init__(mode, device, dtype) self.case = case self.kernel_size = kernel_size self.N = N self.iC = iC self.H = H self.W = W self.oC = oC self.data = self.rand( [N, iC, H, W], device=device, requires_grad=self.requires_grad ) if case == "conv": self.groups = 1 elif case == "depthwise_conv": self.groups = iC else: raise ValueError(f"invalid case: {case}") self.conv = self.conv2d_layer(iC, oC, kernel_size, groups=self.groups) if device != "cpu": self.to_device(self.conv, device) def forward(self): y = self.conv(self.data) return y def config(self): return [self.kernel_size, self.N, self.iC, self.H, self.W, self.oC] def memory_workload(self): if self.mode == "fwd": sol_count = {"i": 1, "o": 1, "k": 1} algorithmic_count = {"i": 1, "o": 1, "k": 1} else: sol_count = {"i": 1 + 1, "o": 1 + 1, "k": 1 + 1} algorithmic_count = {"i": 1 + (1 + 1), "o": 1 + (1 + 1), "k": 1 + (1 + 1)} buffer_size = { "i": self.N * self.iC * self.H * self.W, "o": self.N * self.oC * self.H * self.W, "k": self.oC * (self.iC / self.groups) * self.kernel_size * self.kernel_size, } sol_size = 0 algorithmic_size = 0 for key in sol_count: sol_size += buffer_size[key] * sol_count[key] algorithmic_size += buffer_size[key] * algorithmic_count[key] return {"sol": sol_size, "algorithmic": algorithmic_size} def compute_workload(self): if self.mode == "fwd": count = 1 elif self.mode == "both": count = 1 + (1 + 1) else: raise ValueError(f"invalid mode: {self.mode}") op_count = ( self.N * self.iC / self.groups * self.oC * self.kernel_size * self.kernel_size * self.H * self.W ) op_count *= 2 return op_count * count @staticmethod def default_configs(): return [ [3, 64, 32, 128, 128, 64], ] class ConvBench(ConvImplBench): def __init__(self, *args): super().__init__("conv", *args) @staticmethod def module(): return "conv" class DepthwiseConvBench(ConvImplBench): def __init__(self, *args): super().__init__("depthwise_conv", *args) @staticmethod def module(): return "depthwise_conv" benchmark.register_benchmark_class(ConvBench) benchmark.register_benchmark_class(DepthwiseConvBench)