code: def not_supported_reasons(cls, d: Inputs) -> List[str]:
      reasons = super(BwOp, cls).not_supported_reasons(d)
      check_lastdim_alignment_stride1(reasons, "query", d.query, 8)
      _check_needs_no_topleft(d, reasons)
      if d.device.type == "cuda":
          # Due to limited shared-memory, some GPUs are limited in head dimension
          device_capability = torch.cuda.get_device_capability(d.device)
          is_sm80_or_sm90 = device_capability in [(8, 0), (9, 0)]
          if (
              max(d.key.shape[-1], d.query.shape[-1])
              > cls.MAX_HEADDIM_SM8x
              and not is_sm80_or_sm90
          ):
              reasons.append(
                  "requires a GPU with compute capability 8.0 "
                  f"(A100) or 9.0 (H100) for 'query.shape[-1] > {cls.MAX_HEADDIM_SM8x}'"
              )
      return reasons
  
imports: import os
  from dataclasses import replace
  from itertools import zip_longest
  from typing import Any, List, Optional, Set, Tuple, Union
  import torch
  from ..common import _get_storage_base, get_operator, register_operator
  from .attn_bias import AttentionBias, BlockDiagonalCausalFromBottomRightMask, BlockDiagonalCausalLocalAttentionFromBottomRightMask, BlockDiagonalCausalLocalAttentionMask, BlockDiagonalCausalMask, BlockDiagonalCausalWithOffsetPaddedKeysMask, BlockDiagonalMask, LocalAttentionFromBottomRightMask, LowerTriangularFromBottomRightLocalAttentionMask, LowerTriangularFromBottomRightMask, LowerTriangularMask
  from .common import AttentionBwOpBase, AttentionFwOpBase, Context, Gradients, Inputs, check_lastdim_alignment_stride1
label_desc: Use image node_id 2 for calling the BwOp obj's underlying member method code with example usage: obj.not_supported_reasons(cls, d) and returns: reasons