def METHOD_NAME(
    min_run_time, batch_size, embed_dimension, num_heads, max_sequence_len, dtype
):
    dropout_p = 0.0
    mask = None
    pt = torch.nn.MultiheadAttention(
        embed_dim=embed_dimension,
        num_heads=num_heads,
        batch_first=True,
        dropout=dropout_p,
    )
    npt = pt.cuda().to(dtype)
    cpt = build_composite_mha_from_nn_mha(npt)
    x = torch.randn(
        batch_size,
        max_sequence_len,
        embed_dimension,
        dtype=dtype,
        device="cuda",
        requires_grad=True,
    )
    with torch.backends.cuda.sdp_kernel(enable_math=False, enable_mem_efficient=True):
        rand_fused_upward = cpt(x, x, x, mask).clone().detach()
    with torch.backends.cuda.sdp_kernel(enable_math=True, enable_mem_efficient=False):
        rand_eager_upward = cpt(x, x, x, mask).clone().detach()
    t0 = benchmark.Timer(
        stmt="forw_back_fused(cpt, (x,x,x,mask), rand_fused_upward)",
        globals={
            "forw_back_fused": forw_back_fused,
            "cpt": cpt,
            "x": x,
            "rand_fused_upward": rand_fused_upward,
            "mask": mask,
        },
        label=f"Fused SDP forward and backward batch_size={batch_size} max_sequence_len={max_sequence_len} "
        f"num_heads={num_heads} embed_dimension={embed_dimension} dtype={dtype}",
        num_threads=torch.get_num_threads(),
    )
    t1 = benchmark.Timer(
        stmt="forw_back_eager(cpt, (x,x,x,mask), rand_eager_upward)",
        globals={
            "forw_back_eager": forw_back_eager,
            "cpt": cpt,
            "x": x,
            "rand_eager_upward": rand_eager_upward,
            "mask": mask,
        },
        label=f"Eager SDP forward and backward batch_size={batch_size} max_sequence_len={max_sequence_len} "
        f"num_heads={num_heads} embed_dimension={embed_dimension} dtype={dtype}",
        num_threads=torch.get_num_threads(),
    )
    m0 = t0.blocked_autorange(min_run_time=min_run_time)
    m1 = t1.blocked_autorange(min_run_time=min_run_time)
    print(m0)
    print(m1)
    activities = [ProfilerActivity.CPU, ProfilerActivity.CUDA]
    print("Profile for Fused".center(200, "-"))
    with torch.backends.cuda.sdp_kernel(enable_math=False, enable_mem_efficient=True):
        with profile(
            activities=activities, record_shapes=False, with_stack=True
        ) as prof:
            with record_function("Fused SDP forward and backward"):
                for _ in range(20):
                    forw_back(cpt, (x, x, x, mask), rand_fused_upward)
    print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=20))
    print("Profile for eager".center(200, "-"))
    with torch.backends.cuda.sdp_kernel(enable_math=True, enable_mem_efficient=False):
        with profile(
            activities=activities, record_shapes=False, with_stack=True
        ) as prof:
            with record_function("Fused SDP forward and backward"):
                for _ in range(20):
                    forw_back(cpt, (x, x, x, mask), rand_eager_upward)
    print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=20))