import pytest
import torch
from . import performance_utils as base
from .attri_util import DEFAULT_METRICS, FLOAT_DTYPES
def mm_input_fn(b, m, n, k, cur_dtype, device, b_column_major):
inp1 = torch.randn([m, k], dtype=cur_dtype, device=device)
if b_column_major:
inp2 = torch.randn([n, k], dtype=cur_dtype, device=device)
yield inp1, inp2.t()
else:
inp2 = torch.randn([k, n], dtype=cur_dtype, device=device)
yield inp1, inp2
@pytest.mark.mm
def test_mm():
bench = base.BlasBenchmark(
op_name="mm",
input_fn=mm_input_fn,
torch_op=torch.Tensor.mm,
dtypes=FLOAT_DTYPES,
)
bench.run()
class MmSelfTransposeBenchmark(base.GenericBenchmark2DOnly):
DEFAULT_METRICS = DEFAULT_METRICS[:] + ["tflops"]
def set_more_shapes(self):
return []
def get_tflops(self, op, *args, **kwargs):
m, k = args[0].shape
return 2 * m * m * k
def _input_fn(shape, cur_dtype, device):
m, k = shape
inp = torch.randn([k, m], dtype=cur_dtype, device=device).t()
yield inp,
def torch_mm_self_transpose(inp):
return torch.mm(inp, inp.t())
@pytest.mark.mm
def test_mm_self_transpose_benchmark():
bench = MmSelfTransposeBenchmark(
op_name="mm_self_transpose",
input_fn=_input_fn,
torch_op=torch_mm_self_transpose,
dtypes=FLOAT_DTYPES,
)
bench.run()