Coverage for src/flag_gems/runtime/backend/_ascend/ops/flip.py: 0%
34 statements
« prev ^ index » next coverage.py v7.6.9, created at 2026-03-11 02:28 +0800
« prev ^ index » next coverage.py v7.6.9, created at 2026-03-11 02:28 +0800
1import logging
3import torch
4import triton
6from flag_gems.utils import pointwise_dynamic
7from flag_gems.utils.codegen_config_utils import CodeGenConfig
8from flag_gems.utils.tensor_wrapper import StridedBuffer
10logger = logging.getLogger(f'flag_gems.runtime._ascend.ops.{__name__.split(".")[-1]}')
13config_ = CodeGenConfig(
14 2048,
15 tuple([48, 1, 1]),
16 32,
17 False,
18 prefer_1d_tile=int(triton.__version__[0]) < 3,
19)
22@pointwise_dynamic(is_tensor=[True], promotion_methods=[(0, "DEFAULT")], config=config_)
23@triton.jit
24def copy_func(x):
25 return x
28def flip(A: torch.Tensor, dims) -> torch.Tensor:
29 logger.debug("GEMS_ASCEND FLIP")
30 strides = list(A.stride())
31 flip_dims_b = [False for _ in A.stride()]
32 for dim in dims:
33 assert (
34 dim >= -A.dim() and dim < A.dim()
35 ), "Dimension out of range (expected to be in range of [{}, {}], but got {})".format(
36 -A.dim(), A.dim() - 1, dim
37 )
38 assert not flip_dims_b[
39 dim
40 ], "dim {} appears multiple times in the list of dims".format(dim)
41 flip_dims_b[dim] = True
42 n = 0
43 offset = 0
44 for i in range(len(flip_dims_b)):
45 if flip_dims_b[i] and A.size(i) > 1 and A.stride(i) != 0:
46 offset += strides[i] * (A.shape[i] - 1)
47 strides[i] = -strides[i]
48 n += 1
49 if n == 0 or A.numel() <= 1:
50 return A.clone()
51 out = torch.empty_like(A)
52 # a flipped view of A
53 flipped_A = StridedBuffer(A, strides=strides, offset=offset)
55 # TODO: flip op can have a custom task simplification method, but we skip it now and just use A's rank.
56 overload = copy_func.instantiate(A.ndim)
57 overload(flipped_A, out0=out)
58 return out